AOJ789 买酒

买酒
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 70   Submission Accepted: 22
 
Description
众所周知,西瓜是一个很爱喝酒的人。有一天西瓜和朋友去酒楼喝酒,却发现酒楼在大酬宾,活动规则如下。
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;
}

  

原文地址:https://www.cnblogs.com/IMGavin/p/5741770.html