题目: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; }