AOJ 789.买酒

595

题目



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