pat乙级刷题第十天(1019.1020)
作者:互联网
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
位数格式输出。
输入样例 1:
6767
结尾无空行
输出样例 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
结尾无空行
输入样例 2:
2222
结尾无空行
输出样例 2:
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;
}
标签:空行,输出,pat,第十天,月饼,int,样例,数字,1019.1020 来源: https://blog.csdn.net/qq_45996378/article/details/119256467