HDU 1847 博弈

sg[0]=0;

sg[i]=mex{sg[i-2^(j)]}  (i>=2^j)

mex()为不在此集合的最小非负整数


#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
using namespace std;
int main()
{
int sg[10000];
int n;
int i;
vector <int> nim;
while (scanf("%d",&n)!=EOF)
{
sg[0]=0;
for (i = 1; i <= n; i++)
{
nim.clear();
int tmp=i;
int each=1;
while (tmp>=each)
{
nim.push_back(sg[tmp-each]);
each<<=1;
}
int x=0;
sort(nim.begin(),nim.end());
for (int j=0;j<nim.size();j++)
{
if (nim[j]==x)
x++;
else
{
if (nim[j]>x)
break;
}
}
sg[i]=x;
}
if (sg[n]==0)
printf("Cici\n");
else
printf("Kiki\n");
}
return 0;
}

时间: 2024-07-30 13:48:23

HDU 1847 博弈的相关文章

HDU 1847 (博弈 找规律) Good Luck in CET-4 Everybody!

多写几个就会发现3的倍数是必败点,担心可能有例外,我一直写到第15个.. 1 #include <cstdio> 2 3 int main() 4 { 5 int n; 6 while(scanf("%d", &n) == 1 && n) 7 printf("%s\n", n % 3 ? "Kiki" : "Cici"); 8 9 return 0; 10 } 代码君

HDU 1847 Good Luck in CET-4 Everybody! (巴什博弈)

题目链接:HDU 1847 Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考前的放松,所谓"张弛有道"就是这个意思.这不,Kiki和Cici在每天晚上休息之前都要玩一会儿扑克牌以放松神经. "升级"?"双扣"?"红五"?还是"斗

hdu 1847 Good Luck in CET-4 Everybody!

法一: 首先我们可以想到在面对3的时候是必败局,谁面对3时无论拿多少都会败 ! <---这是关键 那么就要尽量造成这样的局势给对方,因为任何不是3的倍数的数加1或2都可以变成3的倍数, 同理减去1或2也可以变成3的倍数,也就是说假设目前的个数不是3的倍数,那我肯定能把它 拿成3的倍数,比如现在是11个,那我拿走2个就变成9,这样就造成对方为3的倍数局势,那 么对方拿m个我都可以通过拿1或者2使总共一轮拿的数目成为3的倍数 #include<stdio.h> int main() { in

HDU 1847 Good Luck in CET-4 Everybody!(巴什博弈论)

题目地址:HDU 1847 这题可以用NP状态转换. 首先0的时候就代表无法出牌了,所以是必败态.然后根据每一个可以一步到达必败态的是必胜态,不可以一步到达必败态的是必败态.可以推出状态转移方程,然后用DP求解.即从已知状态向未知状态转移,就是从小的向大的转移,假如它的下一步没有必败态,则它是必败态,若下一步有一个必败态,那它就是必胜态. 代码如下: #include <iostream> #include <cstdio> #include <string> #inc

HDU 1525 博弈

Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1880    Accepted Submission(s): 825 Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan,

hdu 3537(博弈,翻硬币)

题意:给定了每个正面朝上的硬币的位置,然后每次可以翻1,2,3枚硬币,并且最右边的硬币开始必须是正面朝上的. 分析: 约束条件6:每次可以翻动一个.二个或三个硬币.(Mock Turtles游戏) 初始编号从0开始. 当N==1时,硬币为:正,先手必胜,所以sg[0]=1. 当N==2时,硬币为:反正,先手必赢,先手操作后可能为:反反或正反,方案数为2,所以sg[1]=2. 当N==3时,硬币为:反反正,先手必赢,先手操作后可能为:反反反.反正反.正反正.正正反,方案数为4,所以sg[2]=4.

hdu 1848 博弈之SG函数的使用

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题目简单描述为: 1.  这是一个二人游戏;2.  一共有3堆石子,数量分别是m, n, p个:3.  两人轮流走;4.  每走一步可以选择任意一堆石子,然后取走f个:5.  f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8-等数量):6.  最先取光所有石子的人为胜者:假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢. 代码为: ? 1 2 3 4 5 6 7 8 9

HDU 1525 (博弈) Euclid&#39;s Game

感觉这道题用PN大法好像不顶用了,可耻地看了题解. 考虑一下简单的必胜状态,某一个数是另一个数的倍数的时候是必胜状态. 从这个角度考虑一下:游戏进行了奇数步还是偶数步决定了哪一方赢. 如果b > 2a,那么这一方就有权利改变游戏步数的奇偶性,从而到达对自己有利的状态,所以这是一个必胜状态. 如果a < b < 2a,那么下一步只能到达(b-a, a)状态,一直模拟就行. 1 #include <cstdio> 2 #include <algorithm> 3 us

HDU 1847 Good Luck in CET-4 Everybody! (博弈论sg)

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