F - Three Variables Game(暴力+贪心+思维)

Posted accepting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F - Three Variables Game(暴力+贪心+思维)相关的知识,希望对你有一定的参考价值。

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

 

以上是关于F - Three Variables Game(暴力+贪心+思维)的主要内容,如果未能解决你的问题,请参考以下文章

AT2070 Card Game for Three(组合数学)

[Statistics] Comparison of Three Correlation Coefficients: Pearson, Kendall, Spearman

leetcode679. 24 Game

codeforce F - Three Paths on a Tree

Fxx and game

B - Game of Connections