zoukankan      html  css  js  c++  java
  • 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;
    }

     

  • 相关阅读:
    腾讯云通信服务端返回签名
    synchronized同步语句块
    synchronized同步方法
    springjdbc的批量操作
    yield方法
    暂停线程
    【jdk源码学习】HashMap
    diamond types are not supported at this language level
    【java基础系列】一、常用命令行
    Socket通信综合示例
  • 原文地址:https://www.cnblogs.com/Accepting/p/12828032.html
Copyright © 2011-2022 走看看