CF1706A Another String Minimization Problem 题解

题意

给定一个长度为 \(n\) 的序列 \(a\) 以及一个长度为 \(m\) 的字符串 \(s\),初始 \(s\) 均为 \(\text{B}\),第 \(i\) 次操作可以把 \(s_{a_i}\)\(s_{m+1-a_i}\) 修改为 \(\text{A}\),求修改过后的字典序最小的 \(s\)

思路

因为要使字典序最小,所以要让 \(\text A\) 尽量靠前,所以会出现以下几种情况:

  1. 设当前更改位置为第 \(i\) 位,若 \(s_i\)\(s_{m+1-i}\) 位均为 \(\text B\),那么 \(s_{\min (i,m+1-i)}=\text A\)

  2. 设当前更改位置为第 \(i\) 位,若 \(s_i\)\(s_{m+1-i}\) 其中有一位为 \(\text A\),那么更改另一位。

那么每次优先考虑 \(i\)\(m+1-i\) 中更小的那一位进行修改,如果已修改则修改另一位。

#include <cstdio>
#include <iostream>
#include <cstring>
 
using namespace std;
 
int t;
int n,m;
int s[55];
 
int main()
{
	scanf("%d",&t);
	
	while(t--)
	{
		memset(s,0,sizeof(s));
		scanf("%d%d",&n,&m);
		int a;
		
		for(register int i=1;i<=n;i++)
		{
			scanf("%d",&a);
			if(s[a]) s[m+1-a]=1;
			else if(s[m+1-a]) s[a]=1;
			else s[min(a,m+1-a)]=1;
		}
		
		for(register int i=1;i<=m;i++)
		{
			if(s[i]==1) printf("A");
			else printf("B");
		}
		
		printf("\n");
	}
	
	return 0;
}
posted @ 2022-07-22 14:45  Scorilon  阅读(57)  评论(0)    收藏  举报