这是一道简单的构造题。
我们注意到题目中并未说字符不能一样,所以我们可以最大化前面的字符 \(s_1,s_2\dots s_i\)(\(1\le i\le n\))的差距使得前面字符的差距为 \(k\),然后剩下的字符就跟 \(s_j\)(\(i+1\le j \le n\))一样。
我们每次记一个字符串 \(t\) 来记答案,然后我们每次让 \(k\) 都减去差距,如果最后 \(k\ne 0\),说明不存在一个字符串 \(t\),我们就输出 \(-1\)。
AC Code:
#include <bits/stdc++.h>
using namespace std;
int n, k;
string s, t;
int main()
{scanf("%d%d", &n, &k);cin >> s;for (int i = 0; i < n; i++){int x = max('z' - s[i], s[i] - 'a');// cout<<x<<' '<<k<<'\n';if (k < x){if (x == 'z' - s[i]){t += char(s[i] + k);k = 0;}else{t += char(s[i] - k);k = 0;}}else{if (x == 'z' - s[i]){k -= x;t += 'z';}else{t += 'a';k -= x;}}}if(k){puts("-1");return 0;}cout<<t<<'\n';
}