Limak is a little polar bear. He likes nice strings — strings of length n, consisting of lowercase English letters only.
The distance between two letters is defined as the difference between their positions in the alphabet. For example, , and
.
Also, the distance between two nice strings is defined as the sum of distances of corresponding letters. For example, , and
.
Limak gives you a nice string s and an integer k. He challenges you to find any nice string s' that . Find any s' satisfying the given conditions, or print "-1" if it's impossible to do so.
As input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to usegets/scanf/printf instead of getline/cin/cout in C++, prefer to use BufferedReader/PrintWriterinstead of Scanner/System.out in Java.
The first line contains two integers n and k (1 ≤ n ≤ 105, 0 ≤ k ≤ 106).
The second line contains a string s of length n, consisting of lowercase English letters.
If there is no string satisfying the given conditions then print "-1" (without the quotes).
Otherwise, print any nice string s' that .
4 26 bear
roar
2 7 af
db
3 1000 hey
-1
定义两个小写字母之间的距离为这两个字母在字母表中的距离,如dis(a,z)=25,dis(a,c)=2,两个长度相同串的距离为这两个串对应位置字母距离之和。现给出一个长度为n的数字串s和一个距离k,问是否存在一个长度为n的串ss,使得dis(s,ss)=k,如果存在任意输出一解,如果不存在则输出-1
贪心,先找到该串与其他串的距离上限,如果该上限大于k则输出-1,否则每次贪心的构造ss,即ss的每个字母与s相对应字母的距离尽量大,一直到抵消掉k
#include <cstdio> #include <algorithm> using namespace std; const int maxn = 100000 + 10; int main() { char s[maxn]; int n, k; while (~scanf("%d%d%s", &n, &k, s)){ int num = 0; for (int i = 0; i < n; i++) num += max(s[i] - 'a', 'z' - s[i]); if (num < k) printf("-1\n"); else{ for (int i = 0; i < n; i++){ int d1 = s[i] - 'a', d2 = 'z' - s[i]; if (k == 0) printf("%c", s[i]); else if (k < max(d1, d2)){ printf("%c", s[i] + k > 'z' ? s[i] - k : s[i] + k); k = 0; } else{ printf("%c", d1 > d2 ? 'a' : 'z'); k -= max(d1, d2); } } printf("\n"); } } return 0; }