AtCoder Beginner Contest 166 F.Three Variables Game
題目鏈接
這題一開始用的暴力,即每次判斷誰大就減誰,但其實是錯誤的,比如:
a=2 b=1 c=0
AB
AC
AC
用暴力的思想就不對,我看了 AC 的代碼都比較難懂,只有一個 DFS 的思路是挺清晰的,下面是代碼,就是逐層 DFS 得到最優解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
string s[N];
char ans[N];
int n,a,b,c;
void dfs(int id,int a,int b,int c){
if(a<0 || b<0 || c<0) return;
if(id==n){
puts("Yes");
for(int i=0;i<n;i++) cout<<ans[i]<<endl;
exit(0);
}
else{
if(s[id]=="AB"){
ans[id]='A';
dfs(id+1,a+1,b-1,c);
ans[id]='B';
dfs(id+1,a-1,b+1,c);
}
else if(s[id]=="AC"){
ans[id]='A';
dfs(id+1,a+1,b,c-1);
ans[id]='C';
dfs(id+1,a-1,b,c+1);
}
else if(s[id]=="BC"){
ans[id]='B';
dfs(id+1,a,b+1,c-1);
ans[id]='C';
dfs(id+1,a,b-1,c+1);
}
}
}
main()
{
cin>>n>>a>>b>>c;
for(int i=0;i<n;i++) cin>>s[i];
dfs(0,a,b,c);
puts("No");
return 0;
}