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; }

浙公网安备 33010602011771号