题目描述:
Alice and Bob are interested in playing games. One day, they invent a game which has rules below:
1. Firstly, Alice and Bob choose some random positive integers, and here we describe them as n, d1, d2,..., dm.
2. Then they begin to write numbers alternately. At the first step, Alice has to write a “0”, here we let s1 = 0 ; Then, at the second step, Bob has to write a number s2which satisfies the condition that s2 = s1 + dk and s2 <= n, 1<= k <= m ; From the third step, the person who has to write a number in this step must write a number si which satisfies the condition that si = si-1 + dk or si = si-1 - dk , and si-2 < si <= n, 1 <= k <= m, i >= 3 at the same time.
3. The person who can’t write a legal number at his own step firstly lose the game.
Here’s the question, please tell me who will win the game if both Alice and Bob play the game optimally.
题解:
自己当时比赛时没有想出来,下面是官方的题解:结论:在所有的d中,选择最小的d,这里记作dmin,Alice和Bob每次都选择+dmin(写下的数是在原来的那个数上加上dmin),按照这样的策略最后的结果就是全局的结果。
可以这样考虑正确性,不妨假设按照以上策略是Alice获胜,那么Alice并不会主动改变策略;假设Bob在某一步突然改变策略,即没有选择+dmin,那么就必然选择了某个+d(不会是-d,因为这样肯定不合法),且d > dmin,那么下一步Alice就可以选择-dmin了,再下一步,Bob就只能选择某个+d,且d > dmin,Alice则可以一如既往的选择-dmin,如此循环,无论每次Bob做什么样的决策,Alice都可以选择-dmin,所以肯定是Bob最先没有选择,同样是Alice获胜。这样就证明了开头的结论。
个人的理解就是,每次这样的选择都可以使得自己的决策最优。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int sec,n,m,d,minn;
int s[1111111];
int main()
{
scanf("%d",&sec);
for(int z=1;z<=sec;z++)
{
scanf("%d%d",&n,&m);
minn=(1<<29);
for(int i=1;i<=m;i++)
{
scanf("%d",&d);
if(d<minn)minn=d;
}
s[0]=-(1<<29);
s[1]=0;
int i=2;
while(s[i-1]+minn<=n)
{
s[i]=s[i-1]+minn;
i++;
}
printf("Case #%d: ",z);
if(i%2==1)
printf("Bob\n");
else
printf("Alice\n");
}
return 0;
}