题解:CF628C Bear and String Distance
这是一道简单的构造题。
我们注意到题目中并未说字符不能一样,所以我们可以最大化前面的字符 \(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';
}

浙公网安备 33010602011771号