先贴个代码,打完比赛回来再补cf又炸了,我回来了。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6684
题目大意:两个人进行一个字符串游戏,给定一个字符串,两个人轮流进行操作,操作有两种:一,选择字符串上的某个字母,使之变成字典序上的下一个字母(如果是z就变成a);二,结束游戏。
第一个人的目标是结束游戏时字符串的字典序尽可能小(a在前为小),第二个人的目标是结束时字符串字典序尽可能大。
假设两人每次都是最佳操作,问输出字符串是什么。
这是个很简单的博弈(但我还是没写出来),为了写出这道题我们要明确三点:一,我们只关心首字母,因为首字母对字典序的影响是绝对的;二,当首字母不是z时,第一个人应当直接结束游戏,因为他不可能得到字典序更小的字符串;三,字母y是个例外,因为双方都不敢对y进行操作(第一个人操作y,第二个人结束游戏,则首字母变为z,第一个人显然失败,反之同理)。
由此得到很简单的变换规律:从头开始,判断第一个非y的字母是否为z,是的话就将之变为b,否则不变,然后输出。
#include<iostream> #include<cstdio> #include<set> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<stdlib.h> #include<queue> #include<algorithm> #include<map> #include<stack> using namespace std; char c[105]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",c); int lc=strlen(c); for(int i=0;i<lc;i++) { if(c[i]=='y') { continue; } else if(c[i]=='z') { c[i]='b'; } break; } printf("%s ",c); } return 0; }