标签:member acm man ++ one any ane next c++
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1288
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2127 Accepted Submission(s): 484
首先判断一些肯定不可能的条件
然后贪心一角硬币,全部使用一角硬币。如果剩下的硬币不是5的倍数。减少一角的使用,使剩下的硬币成为5的倍数
然后贪心五角硬币,如果剩下的硬币不是10的倍数,减少一个五角的使用,如果五角的使用个数为0,减少5个一角的使用个数
如果没有5个一角的,则不满足
这种方法,实现起来比较困难,虽然思想简单,但是要注意的细节太多了
我没有写出来。。。
第二种方法:反向的贪心
1角数量*1+5角数量*5+10角数量*10=X
X-茶价格=y
要你求的是用尽可能多的硬币组成茶价格的值
那么我用尽可能少的硬币组成y
那么剩下的硬币组成的就是价格呀,且硬币的数量还是最大的(因为硬币总数量是确定的)
哈哈哈哈,太聪明了
code:
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main() { int v,num1,num5,num10; while(~scanf("%d %d %d %d",&v,&num1,&num5,&num10)) { if(v+num1+num5+num10==0) break; int c1=0,c5=0,c10=0; if(num1+num5*5+num10*10<v)//所有钱加起来都小于价格 { printf("Hat cannot buy tea.\n"); continue; } if(num1>=v)//1角的钱就可以满足价格 { c1=v; printf("%d YiJiao, %d WuJiao, and %d ShiJiao\n",c1,c5,c10); continue; } //反着贪心 //总钱减去价格这个值 用到的钱个数尽可能少 等价于 价格用到的钱个数尽可能多 int sum=num1+num5*5+num10*10-v; //每次都选择面值最大的,这样钱的个数就最少 int x=sum/10; if(x>num10) { sum=sum-10*num10; x=0; }else { sum=sum-10*x; x=num10-x; } int y=sum/5; if(y>num5) { sum=sum-5*num5; y=0; }else { sum=sum-y*5; y=num5-y; } int flag=1; int z=sum; if(z>num1)//总钱还小于价格,买不了 { flag=0; }else { sum=sum-z; z=num1-z; } if(flag==0) { printf("Hat cannot buy tea.\n"); }else { printf("%d YiJiao, %d WuJiao, and %d ShiJiao\n",z,y,x); } } return 0; }
HUD 1288 Hat's Tea(反向的贪心,非常好的一道题)
标签:member acm man ++ one any ane next c++
原文地址:https://www.cnblogs.com/yinbiao/p/9326153.html