杭电博弈入门题

来源:互联网 发布:国土防线2优化补丁 编辑:程序博客网 时间:2024/05/27 09:46


Good Luck in CET-4 Everybody!

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8128    Accepted Submission(s): 5235


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
13
 

Sample Output
KikiCici

二话不说SG函数:

代码如下:

//http://acm.hdu.edu.cn/showproblem.php?pid=1847//Good Luck in CET-4 Everybody!#include<iostream> using namespace std;const int maxn=1005;int sg[maxn];void getsg(){  sg[0]=0;  for(int i=0;i<=1000;i++)  {    bool vis[maxn]={false};    for(int j=0;(1<<j)<=i;j++)    {      int next=sg[i-(1<<j)];      vis[next]=true;    }    for(int j=0;j<=i;j++)    {      if(!vis[j])      {        sg[i]=j;        break;      }    }  }}int main(){  getsg();  int n;  while(scanf("%d",&n)==1)  {    if(sg[n])printf("Kiki\n");    else printf("Cici\n");  }} 



Rabbit and Grass

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3443    Accepted Submission(s): 2581


Problem Description
大学时光是浪漫的,女生是浪漫的,圣诞更是浪漫的,但是Rabbit和Grass这两个大学女生在今年的圣诞节却表现得一点都不浪漫:不去逛商场,不去逛公园,不去和AC男约会,两个人竟然猫在寝食下棋……
说是下棋,其实只是一个简单的小游戏而已,游戏的规则是这样的:
1、棋盘包含1*n个方格,方格从左到右分别编号为0,1,2,…,n-1;
2、m个棋子放在棋盘的方格上,方格可以为空,也可以放多于一个的棋子;
3、双方轮流走棋;
4、每一步可以选择任意一个棋子向左移动到任意的位置(可以多个棋子位于同一个方格),当然,任何棋子不能超出棋盘边界;
5、如果所有的棋子都位于最左边(即编号为0的位置),则游戏结束,并且规定最后走棋的一方为胜者。

对于本题,你不需要考虑n的大小(我们可以假设在初始状态,棋子总是位于棋盘的适当位置)。下面的示意图即为一个1*15的棋盘,共有6个棋子,其中,编号8的位置有两个棋子。



大家知道,虽然偶尔不够浪漫,但是Rabbit和Grass都是冰雪聪明的女生,如果每次都是Rabbit先走棋,请输出最后的结果。
 

Input
输入数据包含多组测试用例,每个测试用例占二行,首先一行包含一个整数m(0<=m<=1000),表示本测试用例的棋子数目,紧跟着的一行包含m个整数Ki(i=1…m; 0<=Ki<=1000),分别表示m个棋子初始的位置,m=0则结束输入。
 

Output
如果Rabbit能赢的话,请输出“Rabbit Win!”,否则请输出“Grass Win!”,每个实例的输出占一行。
 

Sample Input
2 3 533 5 60
 

Sample Output
Rabbit Win!Grass Win!

思路:水成狗啊。。 变相的n堆石头取石子,直接全部数直接亦或起来就好了。。

代码如下

//http://acm.hdu.edu.cn/showproblem.php?pid=1849//Rabbit and Grass#include<iostream> using namespace std;int main(){  int n,res,t;  while(scanf("%d",&n)==1&&n)  {    scanf("%d",&res);    n--;    while(n--)    {      scanf("%d",&t);      res^=t;    }    if(res)printf("Rabbit Win!\n");    else printf("Grass Win!\n");  }}








1 0
原创粉丝点击