题解:AT_abc166_f [ABC166F] Three Variables Game

题目

思路

这是一道比较简单的贪心题。

不断地分类讨论。哪一个小就加一,另一个就减一。如果两个都相等时,就判断下一个,有相同的就加一,另一个减一,如果都没有相同的,就随便加减。如果两个都为 \(0\) 时,就直接输出 No 即可。

Code

代码有点长。额。

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a,b,c;
string s[100005],ans;
signed main(){
	scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
	for(int i=1;i<=n;i++)
		cin>>s[i];
	for(int i=1;i<=n;i++){
		if(s[i]=="AB"){
			if(a==0&&b==0) {
				puts("No");
				return 0;
			}
			if(a>b){
				b++,a--;
				ans+='B';
			}else if(a<b){
				b--,a++;
				ans+='A';
			}else{
				if(s[i+1]=="BC"){
					b++;
					a--;
					ans+='B';
				}
				else if(s[i+1]=="AC"){
					a++;
					b--;
					ans+='A';
				}else{
					a++;
					b--;
					ans+='A'; 
				}
			}
		}
		if(s[i]=="AC"){
			if(a==0&&c==0)
			{
				puts("No");
				return 0;
			}
			if(a>c){
				c++;
				a--;
				ans+='C';
			}else if(a<c){
				c--,a++;
				ans+='A';
			}else{
				if(s[i+1]=="AB"){
					a++;
					c--;
					ans+='A';
				}
				else if(s[i+1]=="BC"){
					c++;
					a--;
					ans+='C';
				}else{
					a++;
					c--;
					ans+='A';
				}
			}
		}
		if(s[i]=="BC"){
			if(c==0&&b==0)
			{
				puts("No");
				return 0;
			}
			if(c>b){
				b++;
				c--;
				ans+='B';
			}else if(c<b){
				b--,c++;
				ans+='C';
			}else{
				if(s[i+1]=="AC"){
					c++,b--;
					ans+='C';
				}
				else if(s[i+1]=="AB"){
					b++;
					c--;
					ans+='B';
				}else{
					b++;
					c--;
					ans+='B';
				}
			}
		}
	}
	puts("Yes");
	for(int i=1;i<=n;i++){
		cout<<ans[i-1]<<"\n";
	}
	return 0;
}

如有问题,请指出错误。

谢谢!

posted @ 2025-11-02 19:24  xthought  阅读(3)  评论(0)    收藏  举报