AOJ 789.买酒

215

题目



Time Limit: 1000 ms
Case Time Limit: 1000 ms
Memory Limit: 64 MB
Total Submission: 43
Submission Accepted: 6

Description  


众所周知,西瓜是一个很爱喝酒的人。有一天西瓜和朋友去酒楼喝酒,却发现酒楼在大酬宾,活动规则如下。
  1. 全场只要买酒可以买二送一,买2瓶酒就可以送一瓶酒,买4瓶酒就送两瓶酒。
  2. 4个空瓶可以换一瓶酒。
  3. 10个酒瓶盖可以换一瓶酒。
  4. 拿瓶子和盖子换酒可以享受换二送一的优惠(比如8个空瓶可以换两瓶酒,然后再送一瓶;12个空瓶+10个盖子可以换4瓶酒,再送两瓶),并且换来的酒产生的的瓶盖和空瓶依旧可以继续拿给酒楼换酒。
  5. 现在西瓜和朋友们的钱一共有N元, 酒一瓶M元,请问他们最多可以喝多少瓶酒。



Input  


题目包含多组输入,EOF结束,数据最多不超过1000组,对于每组数据包含两个数字N,M表示西瓜和朋友们所有钱的数量和一瓶酒的单价,其中1<=N<=1000000, 1<=M<=50



Output  


对于每组输入,输出单独一行,表示西瓜和他的朋友们最多能喝到多少瓶酒。



Sample Input  


500 10
50 5



Sample Output  


154
27



Hint  


trick较多,请谨慎读题并且思考情况


题解



题意比较简单,但是需要考虑的情况比较多

由于需要最大程度多买酒,而且其中有买两瓶送一瓶的优惠,所以,我们应该尽可能地成对买酒。

有以下情况需要单独考虑:
  1. 能兑换奇数瓶酒,把其中一瓶不兑换,留着以后组成一对兑换
  2. 留着待兑换的一瓶酒不能再组上队,只能直接兑换
  3. 留着待兑换的一瓶酒不能组上队,但兑换后又可以兑换酒//最早未考虑到这种情况

代码



/*
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;
}
发布评论
  • 点击查看/关闭被识别为广告的评论