Java教程

pat乙级刷题第十天(1019.1020)

本文主要是介绍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乙级刷题第十天(1019.1020)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!