测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题