zoukankan      html  css  js  c++  java
  • UESTC794 Balloon Game 博弈

    题目链接:Balloon Game

    题目大意:

    Alice 和 Bob进行一个博弈游戏,他们要摆放气球,保证颜色一样的气球全部相邻出现,现在在一个序列中气球有一部分已经摆放,还有一些未摆放,用"?"表示。比如:a?b?c,那么最后我们能摆放成aabbc,aabdc......

    Alice先手摆放气球,他想让气球的颜色种数为奇数个,Bob后手放,想让颜色种数为偶数个,问对于每个询问Alice是否有必胜策略。

    题目分析:

    第一次看完题目的时候,觉得对于这个博弈问题一些情况是可以解决的:

    1.当出现"a?...?a"这种情况下时,中间一段其实已经确定了是"a",所以只有当Alice和Bob不想改变其他现有格局的气球才会放一个,然后他们都会交替的放颜色确定的气球,所以他们的奇偶性能够“反转”最后的结果。

    2.当出现"a?...?b"这种情况下时,如果先手不想再增加颜色,完全可以在最后一个b前放个"a",那么这一段的"?"也变成了情况1。

    3.当出现"a?...?b"这种情况下时,如果先手想增加颜色的话,那么他会在哪里增加一个新颜色是关键。不管在哪里添加一个新的颜色,我们都会把"?...?",拆成两个序列,这里就需要奇偶讨论了。

    1)当"a?...?b"中的"?"个数为偶数个,那么增加一个颜色,会把其拆成一奇一偶两个"???"序列。这种情况其实与单个"a?...?b"中的"?"个数为奇数个一样的。

    2)当"a?...?b"中的"?"个数为奇数个,那么增加一个颜色,会把其拆成两偶两个"???"序列。这种情况其实与单个"a?...?b"中的"?"个数为偶数个一样的。

    综上所述,能否有必胜的策略的因素有:1)现有颜色个数;2)不确定颜色的气球的奇偶性;3)确定颜色的气球的奇偶性

    不过在训练时我没有敢去做的原因是当时以为要考虑到颜色只有26种,那么判断将相当复杂,因为我们要考虑剩下的颜色个数等等。。。不过后来看到hint里有一句:“Though the showing colors in input case will only be a - z, you can use any color.” QAQ~~~

    所以看清题目还是最关键啊~

    /*author:Samsons
      date:2015.4.12*/
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    
    using namespace std;
    
    int color[26];
    int main()
    {
        //freopen("b.in","r",stdin);
        memset(color,0,sizeof(color));
        char tmp='';
        int num,num_s,num_n,num_co,ans,i;
        num=0;num_s=0;num_n=0;num_co=0;
        char ch;
        while (scanf("%c",&ch)!=EOF)
        {
            if (ch=='?')
            {
                num++;
                continue;
            }
            if (tmp!=ch) 
            {
                color[ch-'a']=1;
                num_n+=num;
                tmp=ch;
                num=0;
            }
            else 
            {
                color[ch-'a']=1;
                num_s+=num;
                tmp=ch;
                num=0;
            }
        }
        num_n+=num;
        for (i=0;i<26;i++)
            if (color[i]==1) num_co++;
        if (num_n==0)
        {    
            if (num_co % 2==1)
            {
                cout<<"Yes"<<endl;
            }
            else
            {
                cout<<"No"<<endl;
            }
            return 0;
        }
        if (num_n==1)
        {
            cout<<"Yes"<<endl;
            return 0;
        }
        ans=0;
        if (num_n % 2==1) ans=1;
        if (num_s % 2==1) 
            if (ans==1) ans=0;
            else ans=1;
        if (ans==1) cout<<"Yes"<<endl;
        else cout <<"No"<<endl;
        return 0;
    }
  • 相关阅读:
    get_folder_size.ps1
    python3-database-shelve
    Windows中实现不依赖账户登录的开机启动程序
    SpringBoot+SpringDataJPA如何实现自定义且自由度高的查询[多表,多查询条件,多排序条件,分页,自定义sql封装]
    Windows phone 8.1之数据绑定(Data Binding)
    TextBox使用技巧--转载
    在Eclipse中使用git把项目导入到git中--转载
    运用多种知识点实现一个综合小游戏
    Git帮助之初始化项目设置向导
    如何从Eclipse导入github上的项目源码--转载
  • 原文地址:https://www.cnblogs.com/samsons/p/4420459.html
Copyright © 2011-2022 走看看