【博弈】SDUT 3790 UMR祝你元宵节快乐!

Step1 Problem:

元宵节到了,cyk 表示对 UMR 不服,于是他们进行了一场游戏:

  1. 他们面前有 n 个数,玩家轮流每次从这 n 个数中挑选出一个数拿走。
  2. 玩家选取的数字大小不能超过上一次玩家所拿的数的大小(譬如,上一个玩家拿了 3,那么下一次玩家只能选择 3, 2, …)。
  3. 当一名玩家无法挑选(没有数字了,或者剩下的数字都比上次玩家挑选的大)的时候则该玩家输掉比赛。

今天的比赛是 UMR 先手,两个人都足够聪明,然后 UMR 能不能够赢得比赛呢?

Step2 Ideas:

如果最小的数的个数是奇数,那么我拿了其中一个,就变成了偶数个。那么必胜。
如果最小的数的个数是偶数,如果我拿最小的数。那么必败。
如果我先手,我想必胜,那么我们应该到了对方的状态必败。所以我们应该先手后让最小的数的个数是偶数,这样对方必败。

Step3 Code:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+100;
int vis[N];
int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        int num, i;
        memset(vis, 0, sizeof(vis));
        for(i = 0; i < n; i++) {
            scanf("%d", &num);
            vis[num]++;
        }
        for(i = 1; i <= 1000; i++) {
            if(vis[i]&1) break;//如果是奇数,那么我拿后,可以让最小的数的个数是偶数,那么我必胜。
        }
        if(i <= 1000) printf("a ha ! cyk , too young too simple sometimes native !\n");
        else printf("en heng UMR , you also have today !\n");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值