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\) 尽量靠前,所以会出现以下几种情况:
-
设当前更改位置为第 \(i\) 位,若 \(s_i\) 和 \(s_{m+1-i}\) 位均为 \(\text B\),那么 \(s_{\min (i,m+1-i)}=\text A\)。
-
设当前更改位置为第 \(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;
}

浙公网安备 33010602011771号