UVA10404

 1 //题意:S 和 O 二人玩游戏 。N颗石头,M个数,每次拿 M[i]个石头(i>0 && i<m) ,谁拿到最后一个谁赢。
 2
 3 //  定义f[i]为还剩i颗石头时的胜负情况 ,若S胜利,则记 1 ,
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<algorithm>
 7 using namespace std;
 8 int f[1000005],a[11];
 9 int main()
10 {
11     int n,m;
12     while(scanf("%d",&n)!=EOF)
13     {
14         scanf("%d",&m);
15         for(int i=0;i<m;i++)
16             scanf("%d",&a[i]);
17         f[0]=0;
18         for(int i=1;i<=n;i++)
19         {
20             f[i]=0;
21             for(int j=0;j<m;j++)
22             {
23                 if(i>=a[j] && f[i-a[j]]==0) // 当剩余石头大于或等于m个数的其中一个 ,并且f[i-a[j]]==0,即刚好拿完,这是S胜,记 1
24                 {
25                     f[i]=1; break;
26                 }
27             }
28         }
29         if(f[n]) printf("Stan wins\n");
30         else printf("Ollie wins\n");
31     }
32     return 0;
33 } 
时间: 2024-10-10 05:45:52

UVA10404的相关文章

uva10404 - Bachet&#39;s Game(博弈,递推)

题目:uva10404 - Bachet's Game(博弈,递推) 题目大意:stan和ollie两个小伙伴在玩石头的游戏:给出N个石头,然后给出M个数.要求每次都是stan先开始,每次拿走m (是M个数中的其中一个)个石头.谁拿走石头后桌上没有剩下石头就赢了. 解题思路:博弈.对于j个石头,stan想要赢的话那么就要分奇数次将j个石头拿走. 假设j个石头这个时候是stan赢,那么j + m个石头就是ollie赢.这样的话,让d[j] = 1代表stan赢,等于0代表ollie赢,只要能够找到