买酒
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 70 Submission Accepted: 22
Total Submission: 70 Submission Accepted: 22
Description
众所周知,西瓜是一个很爱喝酒的人。有一天西瓜和朋友去酒楼喝酒,却发现酒楼在大酬宾,活动规则如下。
1.全场只要买酒可以买二送一,买2瓶酒就可以送一瓶酒,买4瓶酒就送两瓶酒。
2.4个空瓶可以换一瓶酒。
3.10个酒瓶盖可以换一瓶酒。
4.拿瓶子和盖子换酒可以享受换二送一的优惠(比如8个空瓶可以换两瓶酒,然后再送一瓶;12个空瓶+10个盖子可以换4瓶酒,再送两瓶),并且换来的酒产生的的瓶盖和空瓶依旧可以继续拿给酒楼换酒。
现在西瓜和朋友们的钱一共有N元, 酒一瓶M元,请问他们最多可以喝多少瓶酒。
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
Hint
trick较多,请谨慎读题并且思考情况
校赛题
买二送一,一个要注意的是当买的酒数量为奇数时,为保证最优,将数量减一,然后酒瓶数量加4或盖子数量加10.
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector> #include<cmath> #include<utility> using namespace std; typedef long long LL; const int N = 1008, INF = 0x3F3F3F3F; int main(){ int n, m; while(~scanf("%d %d", &n, &m)){ int ping = 0, gai = 0; int ans = 0; ans = n / m; ans += ans/ 2; ping = ans; gai = ans; while(ping >= 4 || gai >= 10){ int tp = ping / 4 + gai / 10; bool flag = 0; if(tp % 2 && tp > 1){//注意 tp--; flag = 1; } tp += tp/ 2; ans += tp; ping = ping % 4 + tp; gai = gai % 10 + tp; if(flag){ ping += 4; } } cout<<ans<<' '; } return 0; }