「AWOI Round 2 B」树学

· · 题解

题目

题目大意:

在字典序最小的情况下让 ab 相同元素个数在 l~r 之间

思路:

因为 'a' 最小,所以先在改动数目小于 r 的情况下把所有能变成 'a' 且本来不是 'a' 的字符变成 'a' ; 如果改动数目小于 l 就从最后一个开始没改过(如果没计算有没有改过会错 3 个点,只能得 20 分)的字符变成 'a' 变成 b 。就可以让字典序最小且合法。

#include<iostream>
#include<string>
using namespace std;
bool t[1000005];//是否被计算过
int main()
{
    int n,l,r,sum;
    string s;//a数列
    cin>>n>>l>>r>>s;
    sum=n;//重复个数
    for(int i=0;i<n;i++)
    {
        if(sum<=l)break;//改的够了
        if(s[i]!='a')
        {
            s[i]='a';
            t[i]=1;//被改过
            sum--;
        }
    }
    for(int i=n-1;i>=0;i--)//没改够
    {
        if(sum<=r)break;//够了
        if(t[i])continue;//已经被改过
        if(s[i]=='a')s[i]='b';
        else s[i]='a';//一般情况下不会出现
        sum--;
    }
    cout<<s<<endl;
    return 0;
}
最后一分钟A的