A21386. 在魔法学院的期末考试中,学生们发现了一本被施了魔法的古籍。古籍的第一页写着: “只有最聪明的巫师才能解开这个谜题:给定一个初始魔法咒语 S 和魔法能量k,每次施法可以选择咒语中连续的一段非z字母进行升级(a→b,b→c,…,y→z)。在最多k次施法后,能得到的字典序最大咒语是什么?”给定一个初始魔法咒语 s 和魔法能量 k,每次施法可以 1.选择字符串中任意一段连续的字母(不能包含'z'…
填空题
较难
知识点
题目描述
题目描述
在魔法学院的期末考试中,学生们发现了一本被施了魔法的古籍。古籍的第一页写着:
“只有最聪明的巫师才能解开这个谜题:给定一个初始魔法咒语 S 和魔法能量k,每次施法可以选择咒语中连续的一段非z字母进行升级(a→b,b→c,…,y→z)。在最多k次施法后,能得到的字典序最大咒语是什么?”
给定一个初始魔法咒语 s 和魔法能量 k,每次施法可以
1.选择字符串中任意一段连续的字母(不能包含'z')
2.将这段字母中每个字母变为字母表中的下一个字母
输入格式
一行包含字符串 S 和整数 k,用空格分隔。
输出格式
一行,表示经过最多 k 次施法后能得到的最大字符串。
样例输入 1
abcde 23样例输出 1
xyzzz样例输入 2
z 1样例输出 2
z参考答案
#include <bits/stdc++.h>
using namespace std;
#define f(i,a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
ll k;
string s;
void solve() {
cin>>s>>k; // 读入初始咒语 s 和最大施法次数 k
// 主循环:每次消耗一次施法能量 k
while (k--) {
// 1. 找到最左侧第一个不是 'z' 的位置 l
int l=0;
f(i, 0, s.size() -1) {
if (s[i] !='z') {
l=i;
break;
}
}
// 2. 从 l 开始,升级所有连续非 'z' 字符
// 一旦碰到 'z',立即停止本次升级
for (int j=l; j< (int)s.size(); ++j) {
if (s[j] =='z')
break;
s[j]++; // 字符"晋升"到下一个字母
}
// 3. 本次施法结束,字符串 s 已更新
}
// 输出结果:最多 k 次施法后的字典序最优咒语
cout<<s;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
上一题
下一题