最近刷pat,见了许多关于贪心算法的题目,刚好又读到算法笔记,就把关于贪心算法的题列出来,总结一下。
pat-b-1023
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:2 2 0 0 0 3 0 0 1 0输出样例:
10015558
自己写的代码:
- #include<iostream>
- #include<algorithm>
- using namespace std;
- int maxn=50;
- int main(){
- int arr[maxn]={-1},num=0;
- for(int i=0;i<10;i++){
- int temp;
- cin>>temp;
- while(temp--){
- arr[num]=i;
- num++;
- }
- }
- sort(arr,arr+num);
- for(int i=0;i<num;i++){
- if(arr[i]!=0){
- cout<<arr[i];
- arr[i]=-1;
- break;
- }
- }
- for(int i=0;i<num;i++){
- if(arr[i]!=-1)
- cout<<arr[i];
- }
- return 0;
- }
算法笔记上面给出的代码:
- #include<cstdio>
- int main(){
- int count[10];
- for(int i=0;i<10;i++)
- scanf("%d",&count[i]);
- for(int i=1;i<10;i++)
- if(count[i]>0){
- printf("%d",i);
- count[i]--;
- break;
- }
- for(int i=0;i<10;i++){
- for(int j=0;j<count[i];j++)
- printf("%d",i);
- }
- return 0;
- }
pat-b-1020
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入样例:3 20 18 15 10 75 72 45输出样例:
94.50
代码如下:
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int maxn=1001;
- struct MoonCake{
- double store; //总量
- double sell; //总价
- double price; //单价
- }mooncake[maxn];
- int cmp(MoonCake a,MoonCake b){
- return a.price>b.price;
- }
- int main(){
- int n;
- double sum;
- cin>>n>>sum;
- for(int i=0;i<n;i++)
- cin>>mooncake[i].store;
- for(int i=0;i<n;i++){
- cin>>mooncake[i].sell;
- mooncake[i].price=mooncake[i].sell/mooncake[i].store;
- }
- sort(mooncake,mooncake+n,cmp);
- double money=0.0,weight=0.0;
- for(int i=0;i<n;i++){
- if(mooncake[i].store+weight<=sum){
- weight+=mooncake[i].store;
- money+=mooncake[i].sell;
- }else{
- money+=mooncake[i].price*(sum-weight);
- break;
- }
- }
- printf("%.02f",money);
- return 0;
- }