The Scarborough Fair

TheScarboroughFair

https://ac.nowcoder.com/acm/problem/200284

题目:The Scarborough Fair
来源:第二届太原理工大学程序设计新生赛决赛(重现赛)

解题思路

岛上使用着三种货币,分别称作A币、B币、C币。
可以使用2枚A币兑换1枚B币,可以使用2枚B币兑换1枚C币,可以使用2枚C币兑换1枚A币。
初始一共有 cnt[0] 枚A币、cnt[1] 枚B币、cnt[2] 枚C币,
需要购买 n 个物品,每个物品只能够用A、B、C三种币的某一种购买。
能否成功兑换到需要的全部 n 个物品。

购买当前物品时,如果需要的货币足够,那么就直接购买,相应的货币减去购买费用,
如果不够,就使用前一种货币兑换,兑换比例 2:1,如果兑换后货币足够,直接购买,
如果还不够,就使用前前一种货币兑换,兑换比例 4:1,如果兑换后货币足够,直接购买,否则,不能成功兑换,flag = false

C++代码

#include<iostream>
using namespace std;

int main(){
    int n;
    int cnt[3];
    cin >> n >> cnt[0] >> cnt[1] >> cnt[2];
    bool flag = true;
    int t, w;
    for(int i=0; i<n; ++i){
        cin >> t >> w;
        if(!flag)
            continue;
        --t;
        if(cnt[t] >= w)
            cnt[t] -= w;
        else{
            w -= cnt[t];
            cnt[t] = 0;
            int k = (t+3-1) % 3;
            if(cnt[k]/2 >= w)
                cnt[k] -= 2*w;
            else{
                w -= cnt[k]/2;
                cnt[k] %= 2;
                int m = (t+3-2) % 3;
                if(cnt[k]==1){
                    cnt[m]-=2;
                    if(cnt[m] < 0){
                        flag = false;
                        continue;
                    }
                    w -= 1;
                    cnt[k] = 0;
                    if(w == 0)
                        continue;
                }
                if(cnt[k]==0){
                    if(cnt[m]/4 >= w){
                        cnt[m] -= 4*w;
                        w = 0;
                    }
                    else
                        flag = false;
                }
            }
        }
    }
    if(flag)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    return 0;
}
全部评论

相关推荐

后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务