HUD 1288 Hat's Tea(反向的贪心,非常好的一道题)
Posted 若有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HUD 1288 Hat's Tea(反向的贪心,非常好的一道题)相关的知识,希望对你有一定的参考价值。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1288
Hat‘s Tea
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2127 Accepted Submission(s): 484
Your program will be given numbers and types of coins Hat has and the tea price. The tea vending machine accepts coins of values 1, 5, 10 RMB (Jiao). The program should output which coins Hat has to use paying the tea so that he uses as many coins as possible.
首先判断一些肯定不可能的条件
然后贪心一角硬币,全部使用一角硬币。如果剩下的硬币不是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(反向的贪心,非常好的一道题)的主要内容,如果未能解决你的问题,请参考以下文章
HDoj-1250-Hat's Fibonacci-大数
HDU 1250 Hat's Fibonacci(大数相加)
HDU 1250 Hat's Fibonacci (递推大数加法string)