1019 数字黑洞 (20 分)
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174
,这个神奇的数字也叫 Kaprekar 常数。
例如,我们从6767
开始,将得到
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174 7641 - 1467 = 6174 ... ...
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
输入给出一个 (0,104) 区间内的正整数 N。
如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000
;否则将计算的每一步在一行内输出,直到 6174
作为差出现,输出格式见样例。注意每个数字按 4
位数格式输出。
6767
结尾无空行
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174
结尾无空行
2222
结尾无空行
2222 - 2222 = 0000
结尾无空行
思路:我是先整型输入,在转换为数组(为了方便对比和输出),然后判断是不是全都是相同的数字,是就直接按要求输出;不是就将数组排序,再将递减排序和递增排序的数弄出来,进行减法运算,然后就按要求输出。
#include<bits/stdc++.h> using namespace std; int main(){ int N; cin>>N; int n[4],a,b,c; while(1){ n[0]=N/1000; n[1]=N/100%10; n[2]=N/10%10; n[3]=N%10; if(n[0]==n[1]&&n[1]==n[2]&&n[2]==n[3]){ cout<<N<<" - "<<N<<" = 0000"; break; } sort(n, n+4); a=n[3]*1000+n[2]*100+n[1]*10+n[0];//递减的数 b=n[0]*1000+n[1]*100+n[2]*10+n[3];//递增的数 c=a-b; cout<<n[3]<<n[2]<<n[1]<<n[0]; cout<<" - "; cout<<n[0]<<n[1]<<n[2]<<n[3]; cout<<" = "; cout<<setw(4)<<setfill('0')<<c; N=c; if(N!=6174) cout<<endl; else break; } return 0; }
1020 月饼 (25 分)
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿元)。
每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2 位。
3 20 18 15 10 75 72 45
结尾无空行
94.50
结尾无空行
思路:这题我是⾸先根据⽉饼的总价和数量计算出每⼀种⽉饼的单价,然后将⽉饼数组按照单价从⼤到⼩排序,根据需求量D的⼤⼩,从单价最⼤的⽉饼开始售卖,将销售掉这种⽉饼的价格累加到money中, 最后输出money就可以啦~
#include<bits/stdc++.h> using namespace std; struct mooncake{ double mount,price,unit;//总库存量,总售价,单价 }; int compare(mooncake a, mooncake b) {//按单价的值从大到小排序 return a.unit > b.unit; } int main(){ int N,D; cin>>N>>D; vector<mooncake> a(N); for(int i=0;i<N;i++){ cin>>a[i].mount; } for(int i=0;i<N;i++){ cin>>a[i].price; } for(int i=0;i<N;i++){ a[i].unit=a[i].price/a[i].mount; } sort(a.begin(),a.end(),compare); double money=0.0; for(int i=0;D>0&&i<N;i++){ if(D<=a[i].mount){ money+=a[i].unit*D; } else{ money+=a[i].unit*a[i].mount; } D-=a[i].mount; } cout<<fixed<<setprecision(2)<<money; return 0; }