• F


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

     

  • 相关阅读:
    CSS的浮动和清除
    外边距合并现象
    CSS 盒子模型
    CSS样式三
    CSS的继承与优先级
    CSS 样式二
    UVA 11922 Permutation Transformer(平衡二叉树)
    HDU 3726 Graph and Queries(平衡二叉树)(2010 Asia Tianjin Regional Contest)
    POJ 1873 The Fortified Forest(枚举+凸包)
    POJ 2069 Super Star(计算几何の最小球包含+模拟退火)
  • 原文地址:https://www.cnblogs.com/Accepting/p/12828032.html
Copyright © 2020-2023  润新知