AOJ 789.买酒
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 43 Submission Accepted: 6Description众所周知,西瓜是一个很爱喝酒的人。有一天西瓜和朋友去酒楼喝酒,却发现酒楼在大酬宾,活动规则如下。
1.全场只要买酒可以买二送一,买2瓶酒就可以送一瓶酒,买4瓶酒就送两瓶酒。
2.4个空瓶可以换一瓶酒。
3.10个酒瓶盖可以换一瓶酒。
4.拿瓶子和盖子换酒可以享受换二送一的优惠(比如8个空瓶可以换两瓶酒,然后再送一瓶;12个空瓶+10个盖子可以换4瓶酒,再送两瓶),并且换来的酒产生的的瓶盖和空瓶依旧可以继续拿给酒楼换酒。
现在西瓜和朋友们的钱一共有N元, 酒一瓶M元,请问他们最多可以喝多少瓶酒。
Input题目包含多组输入,EOF结束,数据最多不超过1000组,对于每组数据包含两个数字N,M表示西瓜和朋友们所有钱的数量和一瓶酒的单价,其中1<=N<=1000000, 1<=M<=50
Output对于每组输入,输出单独一行,表示西瓜和他的朋友们最多能喝到多少瓶酒。
Sample Input
Original Transformed 500 10 50 5
Sample Output
Original Transformed 154 27
Hinttrick较多,请谨慎读题并且思考情况
题意比较简单,但是需要考虑的情况比较多
由于需要最大程度多买酒,而且其中有买两瓶送一瓶的优惠,所以,我们应该尽可能地成对买酒。
有以下情况需要单独考虑:
- 能兑换奇数瓶酒,把其中一瓶不兑换,留着以后组成一对兑换
- 留着待兑换的一瓶酒不能再组上队,只能直接兑换
- 留着待兑换的一瓶酒不能组上队,但兑换后又可以兑换酒//最早未考虑到这种情况
1 /* 2 By:OhYee 3 Github:OhYee 4 Email:oyohyee@oyohyee.com 5 Blog:http://www.cnblogs.com/ohyee/ 6 7 かしこいかわいい? 8 エリーチカ! 9 要写出来Хорошо的代码哦~ 10 */ 11 12 #include <cstdio> 13 #include <algorithm> 14 #include <cstring> 15 #include <cmath> 16 #include <string> 17 #include <iostream> 18 #include <vector> 19 #include <list> 20 #include <queue> 21 #include <stack> 22 using namespace std; 23 24 #define REP(n) for(int o=0;o<n;o++) 25 26 int Do(int N,int M) { 27 int b = 0,a = 0,ans = 0; 28 //a酒瓶 b酒瓶盖 29 ans = N / M;//能买的酒数目 30 31 ans += ans / 2; 32 33 a = ans; 34 b = ans; 35 36 int t = 0; 37 while(!(a < 4 && b < 10 && t != 1)) { 38 t += a / 4 + b / 10; 39 a -= (a / 4) * 4; 40 b -= (b / 10) * 10; 41 int add = (t / 2) * 2; 42 43 //如果这一轮没有不能兑换,则兑换之前没兑换的 44 if(add == 0) 45 add = t; 46 47 t -= add; 48 add += add / 2; 49 ans += add; 50 a += add; 51 b += add; 52 } 53 return ans; 54 } 55 56 int main() { 57 int a,b; 58 while(scanf("%d%d",&a,&b) != EOF) { 59 printf("%d\n",,Do(a,b)); 60 } 61 return 0; 62 }
然而,我并不能保证我说的是对的。请自行验证,如有错误,请指正
新博客地址
https://www.oyohyee.com
https://www.oyohyee.com