hdu 6684 Rikka with Game(2019 Multi-University Training Contest 9 1005)(博弈)

先贴个代码,打完比赛回来再补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\n",c);
    }
    return 0;
}

 

posted @ 2019-08-20 13:26  虚在君  阅读(232)  评论(0编辑  收藏  举报