Codeforces Round #787 (Div. 3)E(2022.5.9第一题)

考点:字符串,贪心(1500)

题意:给一个字符串s,长度为n,求在k步内得到的字典序最小的字符串。

难点:初看很简单,但是他多了一个条件,相同字母在同一步内操作会一起变化。

思路:贪心的从前向后遍历字符串,使s字典序最小。记下可以变到a的最大字符mx,小于mx,cout<<a即可,如果出现s[i]>mx,s[i[=s[i]-(k-mx),那么对于所有的s[i]>mx,s[i]最小可以变成s[i]-(k-mx)。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        string s;
        cin>>s;
        int mx=0;
        for(int i=0;i<n;i++){
            if(s[i]-'a'>k){
                char l=s[i]-(k-mx);
                char r=s[i];
                for(int j=0;j<n;j++){
                    if(l<=s[j]&&s[j]<=r)    s[j]=l;
                }
                break;//只能干一次!!! 
            }
            mx=max(mx,s[i]-'a');
        } 
        for(int i=0;i<n;i++){
            if(s[i]<='a'+mx)    s[i]='a';
        }
        cout<<s<<endl;
    }
    return 0;
}

 

posted @ 2022-05-09 14:15  cf不上1500不改名  阅读(8)  评论(0)    收藏  举报