zoukankan      html  css  js  c++  java
  • HDU 1847 Good Luck in CET-4 Everybody! (博弈论sg)

    Good Luck in CET-4 Everybody!

    Problem Description
    大学英语四级考试就要来临了,你是不是在紧张的复习?或许紧张得连短学期的ACM都没工夫练习了。反正我知道的Kiki和Cici都是如此。当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考前的放松。所谓“张弛有道”就是这个意思。这不,Kiki和Cici在每天晚上歇息之前都要玩一会儿扑克牌以放松神经。


    “升级”?“双扣”?“红五”?还是“斗地主”?
    当然都不是!

    那多俗啊~
    作为计算机学院的学生,Kiki和Cici打牌的时候可没忘记专业,她们打牌的规则是这种:
    1、  总共n张牌;
    2、  两方轮流抓牌。
    3、  每人每次抓牌的个数仅仅能是2的幂次(即:1。2,4,8,16…)
    4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
    如果Kiki和Cici都是足够聪明(事实上不用如果。哪有不聪明的学生~)。而且每次都是Kiki先抓牌,请问谁能赢呢?
    当然,打牌不管谁赢都问题不大,重要的是立即到来的CET-4能有好的状态。



    Good luck in CET-4 everybody!

     

    Input
    输入数据包括多个測试用例,每一个測试用例占一行。包括一个整数n(1<=n<=1000)。
     

    Output
    假设Kiki能赢的话,请输出“Kiki”。否则请输出“Cici”,每一个实例的输出占一行。


     

    Sample Input
    1 3
     

    Sample Output
    Kiki Cici
     

    Author
    lcy
     

    Source
     

    解题思路:

    1、用博弈论sg函数能够解


    依据NP图的关系。发现 n%3=0时,Cici赢,否则Kiki赢


    2、用DP去解。用dp[n][f] 表示还剩n张牌时。f先走。谁赢。


    解题代码:

    1、sg找规律

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            if(n%3==0) printf("Cici
    ");
            else printf("Kiki
    ");
        }
        return 0;
    }
    

    2、DP方法

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int maxn=1100;
    int dp[maxn][2];
    
    int DP(int n,int f){
        if(n<=0) return 1-f;
        if(dp[n][f]!=-1) return dp[n][f];
        if(f==0){
            int ans=1;
            for(int i=1; i<=n ;i=(i<<1) ){
                if(DP(n-i,1-f)<ans ) ans=DP(n-i,1-f);
            }
            return dp[n][f]=ans;
        }else{
            int ans=0;
            for(int i=1; i<=n ;i=(i<<1) ){
                if(DP(n-i,1-f)>ans ) ans=DP(n-i,1-f);
            }
            return dp[n][f]=ans;
        }
    }
    
    int main(){
        memset(dp,-1,sizeof(dp));
        int n;
        while(scanf("%d",&n)!=EOF){
            if(DP(n,0)==0) printf("Kiki
    ");
            else printf("Cici
    ");
        }
        return 0;
    }
    





  • 相关阅读:
    intellij常用快捷键
    C++ 虚函数详解
    第七周作业
    第六周作业
    第四周作业
    第三周作业
    第二周作业
    第一周作业附加作业
    第一周作业。
    第0次作业
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5318186.html
Copyright © 2011-2022 走看看