题目: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;
}
京公网安备 11010502036488号