Conan and Agasa play a Card Game codeforce

题意:有一些牌,牌上面写着数字,Conan(以下简称C)和Agasa(以下简称A)两人玩游戏,每个人轮流取走任意一张牌和比它小的所有牌,最后谁取走最后一张牌,谁赢。要求预测游戏结果,结果必须是两个人发挥最好的情况。

是两个人轮流取,且C先取,

来分析博弈论:

以一列数字来分析(默认为从小到大排列):a1,a2,a3,a3,a3,a4,a4,a5,a6,a7.....an-1,an.

C先来,那么C每次肯定要制定自己尽可能赢的方式来取牌。当an有奇数张的时候,可以推断出C肯定是最终的赢家。C就会按照这种方案来搞,要是an是偶数张的牌的话C在按照上面的方案执行最终就回输掉了,那么与之进行相替换的方案就是看看数值大小为an-1牌的个数,要是其为奇数的话,按照上面的方案来执行 就会看到C会吧数值为an-1及其以下的牌取完,那A就去偶数个数的an第一张。接下来C面对的就是奇数个数的an,最终赢。要是an-1牌张数是也是偶数的时候的呢,那么我们就接着an-2......a1的张数。当遇到奇数个数C就开始搞,要都是偶数,那就人品不好了,说明C必输,(C抽取任意一张之后,与之同样聪明的A也会利用上面C的规则进行来取胜)。

总结得到,当遇到一个牌数为奇数张的时候C就会取胜,而且是必胜。只有所有的数都是偶数的时候才会输。

这样分析出来的就是最优方案。

#include<iostream>
using namespace std;
int a[100005],b[100005];
int main()
{
    int n,cnt=0;
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i],b[a[i]]++;
    for(int i=0; i<n; i++)
        if(b[a[i]]%2)
        {
            cout<<"Conan"<<endl;
            return 0;
        }
    cout<<"Agasa"<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值