贪心算法学习

最近刷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

自己写的代码:

  1. #include<iostream>  
  2. #include<algorithm>  
  3. using namespace std;  
  4. int maxn=50;  
  5. int main(){  
  6.     int arr[maxn]={-1},num=0;  
  7.     for(int i=0;i<10;i++){  
  8.         int temp;  
  9.         cin>>temp;  
  10.         while(temp--){  
  11.             arr[num]=i;  
  12.             num++;  
  13.         }  
  14.     }  
  15.     sort(arr,arr+num);  
  16.     for(int i=0;i<num;i++){  
  17.         if(arr[i]!=0){  
  18.             cout<<arr[i];  
  19.             arr[i]=-1;  
  20.             break;  
  21.         }  
  22.     }  
  23.     for(int i=0;i<num;i++){  
  24.         if(arr[i]!=-1)  
  25.             cout<<arr[i];  
  26.     }  
  27.     return 0;  
  28. }  

算法笔记上面给出的代码:

  1. #include<cstdio>  
  2. int main(){  
  3.     int count[10];  
  4.     for(int i=0;i<10;i++)  
  5.         scanf("%d",&count[i]);  
  6.     for(int i=1;i<10;i++)  
  7.         if(count[i]>0){  
  8.             printf("%d",i);  
  9.             count[i]--;  
  10.             break;  
  11.         }  
  12.     for(int i=0;i<10;i++){  
  13.         for(int j=0;j<count[i];j++)  
  14.             printf("%d",i);  
  15.     }  
  16.     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

代码如下:

  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<algorithm>  
  4. using namespace std;  
  5. const int maxn=1001;  
  6. struct MoonCake{  
  7.     double store; //总量  
  8.     double sell; //总价  
  9.     double price; //单价  
  10. }mooncake[maxn];  
  11. int cmp(MoonCake a,MoonCake b){  
  12.     return a.price>b.price;  
  13. }  
  14. int main(){  
  15.     int n;  
  16.     double sum;  
  17.     cin>>n>>sum;  
  18.     for(int i=0;i<n;i++)  
  19.         cin>>mooncake[i].store;  
  20.     for(int i=0;i<n;i++){  
  21.         cin>>mooncake[i].sell;  
  22.         mooncake[i].price=mooncake[i].sell/mooncake[i].store;  
  23.     }  
  24.     sort(mooncake,mooncake+n,cmp);  
  25.     double money=0.0,weight=0.0;  
  26.     for(int i=0;i<n;i++){  
  27.         if(mooncake[i].store+weight<=sum){  
  28.             weight+=mooncake[i].store;  
  29.             money+=mooncake[i].sell;  
  30.         }else{  
  31.             money+=mooncake[i].price*(sum-weight);  
  32.             break;  
  33.         }  
  34.     }  
  35.     printf("%.02f",money);  
  36.     return 0;  
  37. }  

猜你喜欢

转载自blog.csdn.net/qq_36926514/article/details/79433254