Codeforces Gym 100500E IBM Chill Zone
The stones game was invented by one of ICPC world finalists. It a 2-player game. It consists of a line of n stones and at each move a player should remove k consecutive stones, and if the player can not make any moves he loses, for example if we have n = 6, k = 2 (stones are represented by ’*’, and empty spaces by ’.’):
First player now has no valid moves, so he loses, but note that he did not play optimally here.
Given n, and k assume both players play optimally well, determine if the first player is losing or winning.
The first line will be the number of test cases T. Each of the following T lines will contain 2 numbers n, k.
1≤T ≤100 1 ≤ n ≤ 50 1≤k≤n
For each test case print a single line containing: Case_x:_y
x is the case number starting from 1.
y is either ’Winning’, or ’Losing’ without the quotes (winning if the first is winning, losing otherwise) Replace underscores with spaces.
Examples
Input
2
5 2
5 3
Output
Case 2: Winning
题意:给连续n个石子,两人轮流拿石子,每次必须取连续的k个石子,在最优策略下询问先手胜负。
做法:SG函数,根据题意写出对应的SG函数,注意VIS数组开在SG转移里头,保证所有的状态之间不会互相干扰。
/*written by tomriddly*/
#include <bits/stdc++.h>
using namespace std;
int n, m;
int f[55];
inline int sg(const int &x)
{
//printf("%d %d\n", x, f[x]);
if (f[x] != -1)
return f[x];
bool vis[50*50 + 5];
memset(vis, false, sizeof(vis));
for (int i = 1; i + m - 1 <= x; i++)
{
// printf("%d: %d\n", x, sg(i - 1) ^ sg(x - i - m + 1));
vis[sg(i - 1) ^ sg(x - i - m + 1)] = true;
}
int i = 0;
while (vis[i])
i++;
return f[x] = i;
}
int main()
{
int fuck;
scanf("%d", &fuck);
for (int cas = 1; cas <= fuck; cas++)
{
memset(f, -1, sizeof(f));
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
f[i] = 0;
if (sg(n))
printf("Case %d: Winning\n", cas);
else
printf("Case %d: Losing\n", cas);
}
return 0;
}
本文介绍了Codeforces Gym 100500E中的问题,该问题涉及一种名为“石头游戏”的两玩家博弈。通过使用SG函数来确定在最优策略下先手玩家是否能赢得游戏。
3776

被折叠的 条评论
为什么被折叠?



