题目
Time Limit:
1000 ms
Case Time Limit:1000 ms
Memory Limit:64 MB
Total Submission:43
Submission Accepted:6
Description
众所周知,西瓜是一个很爱喝酒的人。有一天西瓜和朋友去酒楼喝酒,却发现酒楼在大酬宾,活动规则如下。
- 全场只要买酒可以买二送一,买2瓶酒就可以送一瓶酒,买4瓶酒就送两瓶酒。
- 4个空瓶可以换一瓶酒。
- 10个酒瓶盖可以换一瓶酒。
- 拿瓶子和盖子换酒可以享受换二送一的优惠(比如8个空瓶可以换两瓶酒,然后再送一瓶;12个空瓶+10个盖子可以换4瓶酒,再送两瓶),并且换来的酒产生的的瓶盖和空瓶依旧可以继续拿给酒楼换酒。
现在西瓜和朋友们的钱一共有N元, 酒一瓶M元,请问他们最多可以喝多少瓶酒。Input
题目包含多组输入,EOF结束,数据最多不超过1000组,对于每组数据包含两个数字N,M表示西瓜和朋友们所有钱的数量和一瓶酒的单价,其中1<=N<=1000000, 1<=M<=50
Output
对于每组输入,输出单独一行,表示西瓜和他的朋友们最多能喝到多少瓶酒。
Sample Input
500 10
50 5Sample Output
154
27Hint
trick较多,请谨慎读题并且思考情况
题解
题意比较简单,但是需要考虑的情况比较多
由于需要最大程度多买酒,而且其中有买两瓶送一瓶的优惠,所以,我们应该尽可能地成对买酒。
有以下情况需要单独考虑:
- 能兑换奇数瓶酒,把其中一瓶不兑换,留着以后组成一对兑换
- 留着待兑换的一瓶酒不能再组上队,只能直接兑换
- 留着待兑换的一瓶酒不能组上队,但兑换后又可以兑换酒//最早未考虑到这种情况
代码
/* By:OhYee Github:OhYee Email:oyohyee@oyohyee.com Blog:http://www.cnblogs.com/ohyee/ かしこいかわいい? エリーチカ! 要写出来Хорошо的代码哦~ */ #include <cstdio> int Do(int N,int M) { int b = 0,a = 0,ans = 0; //a酒瓶 b酒瓶盖 ans = N / M;//能买的酒数目 ans += ans / 2; a = ans; b = ans; int t = 0; while(!(a < 4 && b < 10 && t != 1)) { t += a / 4 + b / 10; a -= (a / 4) * 4; b -= (b / 10) * 10; int add = (t / 2) * 2; //如果这一轮没有不能兑换,则兑换之前没兑换的 if(add == 0) add = t; t -= add; add += add / 2; ans += add; a += add; b += add; } return ans; } int main() { int a,b; while(scanf("%d%d",&a,&b) != EOF) { printf("%d\n",Do(a,b)); } return 0; }