题解: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';
}
posted @ 2026-01-02 13:33  OI_emperor  阅读(1)  评论(0)    收藏  举报