全WA求求求救!!跪谢!!
查看原帖
全WA求求求救!!跪谢!!
1082583
allyears楼主2024/6/3 20:58

思路: 先满足 a 的条件 再一个个变满足 e

满足 a 之后 保底会产生abs ( cnta - a )个错误

之后每改变一次会产生 2 个错误 只要一个个找直到满足 e 即可

不存在的情况放前面特判 当( e - abs ( cnta - a ) )%!=0时 不存在 || 保底的错误(abs(cnta-a) > e 也不存在```c #include<bits/stdc++.h> #define ll long long using namespace std;

const ll N=2e6+10; char ans[N]; bool pd[N];

ll n,a,e; ll T; int main() { cin>>T; while (T--) { cin>>n>>a>>e; ll cnta=0,E=0;

	for(int i=1;i<=2*n;i++)
	{
		pd[i]=false;
	
		cin>>ans[i];
		if(ans[i]=='A') cnta++;
	}
	if( (e - ( abs(cnta-a) ) )%2!=0 || e<( abs(cnta-a) ) )
	{
		cout<<-1<<endl;
		continue;
	}
	
	if(cnta>a)
	{
		for(int i=1;i<=2*n;i++)
		{
			if(E+a==cnta) break;
			if(ans[i]=='A')
			{
				ans[i]='B';
				E++;
				pd[i]=true;
			}
		 } 
	}
	else if(cnta<a)
	{
		
		for(int i=1;i<=2*n;i++)
		{
			if(cnta+E==a) break;
			
			if(ans[i]=='B')
			{
				ans[i]='A';
				E++;
				pd[i]=true;;
			}
		 } 
	}
	if(E<e)
	{
		ll tb=1;
		for(int i=1;i<=2*n;i++)
		{
			
			if(E==e) break;
			
			if(ans[i]=='A'&&pd[i]==false)
			{
				
				for(int j=tb;j<=2*n;j++)
				{
					if(ans[j]=='B'&&pd[j]==false)
					{
						tb=j;
						ans[j]='A';
						ans[i]='B';
						pd[i]=true;
						pd[j]=true;
						break;	
					}
				}
				E+=2;
			}
		} 		
	}
	
	for(int i=1;i<=2*n;i++)
	{
		cout<<ans[i];
	}	
	cout<<endl;			  
}	
return 0;

}

2024/6/3 20:58
加载中...