YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

被这个题目卡了好久,思路大致是对的,但是一直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;
}

 

posted on 2020-05-04 20:16  Target--fly  阅读(242)  评论(0编辑  收藏  举报