被这个题目卡了好久,思路大致是对的,但是一直wa,好像是当a+b+c<=2的时候需要特判,然后其他情况就贪心就好了。另外一个思路和这个差不多,也是贪心,比如说遇到了AB,如果次数的a>b,那就选择B,如果a<b那就选择A,如果A=B,这就要考虑一个概率问题了,如果s[i+1]中存在A我们就选择A,否则就选择B,为什么这样是对的呢?因为我们最终的目的是尽量不要让a,b,c成为负数,如果说s[i+1]中存在A,那么在执行i+1这步操作的时候,a减小的概率>b减小的概率,所以说我们可以让a+1,这样a变为负数的概率就小了很多。
code:
#include<bits/stdc++.h> using namespace std; const int N=1e5+7; char s[N][5]; int main(){ int n,a,b,c; cin>>n>>a>>b>>c; for(int i=1;i<=n;i++) scanf("%s",s[i]+1); string ans=""; for(int i=1;i<=n;i++){ if(s[i][1]=='A'&&s[i][2]=='B'){ if(a>b){ a--;b++; ans+='B'; } else if(a<b){ a++;b--; ans+='A'; } else { if(s[i+1][1]=='A'){ a++;b--; ans+='A'; } else{ a--;b++; ans+='B'; } } } else if(s[i][1]=='A'&&s[i][2]=='C'){ if(a>c){ a--;c++; ans+='C'; } else if(a<c){ a++;c--; ans+='A'; } else { if(s[i+1][1]=='A'){ a++;c--; ans+='A'; } else{ a--;c++; ans+='C'; } } } else { if(b>c){ b--;c++; ans+='C'; } else if(b<c){ b++;c--; ans+='B'; } else { if(s[i+1][2]=='C'){ b--;c++; ans+='C'; } else{ b++;c--; ans+='B'; } } } if(a<0||b<0||c<0) return cout<<"No"<<endl,0; } puts("Yes"); int t=ans.size(); for(int i=0;i<t;i++){ cout<<ans[i]<<endl; } return 0; }