zoukankan      html  css  js  c++  java
  • 博弈初步 到时候 再添加吧

    poj 2234 Matches Game

    http://poj.org/problem?id=2234

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int i,j,n,m,t;
     9     while(~scanf("%d",&n))
    10     {
    11         int ans=0;
    12         for(int i=0;i<n;i++)
    13         {
    14             scanf("%d",&m);
    15             ans^=m;
    16         }
    17         if(ans)
    18             printf("Yes
    ");
    19         else printf("No
    ");
    20 
    21     }
    View Code

    hdu 1847 good luck in。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 bool vis[1002];
     6 int sg[1002];
     7 
     8 void getsg()
     9 {
    10     sg[0]=0;
    11     for(int i=1;i<1002;i++)
    12     {
    13         memset(vis,false,sizeof(vis));
    14         for(int j=0;(1<<j)<=i;j++)
    15         {
    16             vis[sg[i-(1<<j)]]=true;
    17         }
    18         for(int j=0;j<1002;j++)
    19             if(vis[j]==false)
    20             {
    21                 sg[i]=j;
    22                 break;
    23             }
    24     }
    25 
    26 }
    27 
    28 int main()
    29 {
    30     int i,j,n,m,t;
    31     getsg();
    32     while(~scanf("%d",&n))
    33     {
    34 
    35         if(sg[n])
    36             printf("Kiki
    ");
    37         else printf("Cici
    ");
    38 
    39     }
    40 
    41     return 0;
    42 }
    View Code

    hdu 1848  Fibonacci again and again

    http://acm.hdu.edu.cn/showproblem.php?pid=1848

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 bool vis[1002];
     6 int sg[1002];
     7 int f[30];
     8 
     9 void getf()
    10 {
    11     f[1]=1;
    12     f[2]=2;
    13     for(int i=3;i<30;i++)
    14         f[i]=f[i-1]+f[i-2];//printf("%d
    ",f[i]);}
    15 }
    16 
    17 void getsg()
    18 {
    19     sg[0]=0;
    20     for(int i=1;i<1002;i++)
    21     {
    22         memset(vis,false,sizeof(vis));
    23         for(int j=1;f[j]<=i;j++)
    24         {
    25             vis[sg[i-f[j]]]=true;
    26         }
    27         for(int j=0;j<1002;j++)
    28             if(vis[j]==false)
    29             {
    30                 sg[i]=j;
    31                 break;
    32             }
    33     }
    34 
    35 }
    36 
    37 int main()
    38 {
    39     int i,j,n,m,t,p;
    40     getf();
    41     getsg();
    42     while(~scanf("%d%d%d",&n,&m,&p))
    43     {
    44         if(n==0&&m==0&&p==0)
    45             break;
    46         int ans=0;
    47         ans=sg[n]^sg[m]^sg[p];
    48 
    49         if(ans)
    50             printf("Fibo
    ");
    51         else printf("Nacci
    ");
    52 
    53     }
    54 
    55     return 0;
    56 }
    View Code

    hdu 2509 be the winner

    http://acm.hdu.edu.cn/showproblem.php?pid=2509

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int i,n,m;
     6     while(cin >> n)
     7     {
     8               int flag = 0; //判断是否是孤单堆
     9               int s = 0;
    10               for(i = 0;i < n;i++) 
    11               {
    12                     cin >> m;
    13                     s ^= m;
    14                     if(m > 1) 
    15                          flag = 1;
    16               }
    17               if(flag == 0)
    18                       if(n % 2)
    19                            cout << "No
    ";
    20                       else
    21                            cout << "Yes
    ";
    22               else
    23                   if(s == 0)
    24                       cout << "No" <<endl;
    25                   else
    26                       cout << "Yes" <<endl;
    27     }
    28     return 0;
    29 }
    View Code

    hdu 1907 john  最后取完的败

    http://acm.hdu.edu.cn/showproblem.php?pid=1907

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int main()
     7 {
     8     int n,t;
     9     scanf("%d",&t);
    10     while(t--)
    11     {
    12         scanf("%d",&n);
    13         int ans=0,a;
    14         int num1=0,num2=0;
    15         for(int i=0;i<n;i++)
    16         {
    17             scanf("%d",&a);
    18             ans^=a;
    19             if(a>1)
    20                 num1++;
    21             else num2++;
    22 
    23         }
    24         if((ans&&num1>0)||(ans==0&&num1==0))
    25             printf("John
    ");
    26         else printf("Brother
    ");
    27 
    28     }
    29     return 0;
    30 }
    View Code

    hdu 2176   取(m堆)石子游戏

      http://acm.hdu.edu.cn/showproblem.php?pid=2176

    a^b ^ c ^ d ...=ans

    a^b ^ d ...=ans^c

    a^b ^ d ^ x=0

    所以  x=0^a^b ^ d=0^ans^c

    所以 要将当前状态变成  奇异态 的取法 :  将第i堆变成 0^ans^a[i]即可    (当然前提是  a[i]>   0^ans^a[i]  )。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<queue>
     5 #include<string>
     6 #define maxx 5002
     7 using namespace std;
     8 
     9 int a[200002];
    10 
    11 
    12 int main()
    13 {
    14     int n,m,i;
    15     //getsg();
    16     while(scanf("%d",&n),n)
    17     {
    18        int ans=0;
    19        for(i=0;i<n;i++)
    20        {
    21            scanf("%d",&a[i]);
    22            ans^=a[i];
    23        }
    24        if(ans==0)
    25           printf("No
    ");
    26         else
    27         {
    28             printf("Yes
    ");
    29             for(i=0;i<n;i++)
    30                if((0^ans^a[i])<a[i])
    31                     printf("%d %d
    ",a[i],0^ans^a[i]);
    32 
    33         }
    34     }
    35     return 0;
    36 }
    View Code

    hdu 2177   取(2堆)石子游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=2177     先 占个坑

    hdu 1850   Being a Good Boy in Spring Festival   

    http://acm.hdu.edu.cn/showproblem.php?pid=1850

    hdu 2960   s-nim

     http://poj.org/problem?id=2960

     1 #include <cstdio>
     2 #include<iostream>
     3 #include <cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int sg[10002],a[10002];
     8 bool vis[10002];
     9 
    10 void getsg(int k)
    11 {
    12     sg[0]=0;
    13     for(int i=1;i<=10000;i++)
    14     {
    15         memset(vis,false,sizeof(vis));
    16         for(int j=0;a[j]<=i&&j<k;j++)
    17             vis[sg[i-a[j]]]=true;
    18         for(int j=0;j<=10000;j++)
    19             if(vis[j]==false)
    20                 {
    21                     sg[i]=j;
    22                     break;
    23                 }
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     int k,m,n;
    30     while(scanf("%d",&k),k)
    31     {
    32         for(int i=0;i<k;i++)
    33             scanf("%d",&a[i]);
    34         sort(a,a+k);
    35         getsg(k);
    36         scanf("%d",&m);
    37         while(m--)
    38         {
    39             int ans=0;
    40             scanf("%d",&n);
    41             while(n--)
    42             {
    43                int x;
    44                scanf("%d",&x);
    45                ans^=sg[x];
    46             }
    47             if(ans)
    48                 printf("W");
    49             else printf("L");
    50         }
    51         printf("
    ");
    52     }
    53 
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    Python-异常处理
    进程及其状态
    操作系统基础
    计算机组成基础
    Java wait()、notify()、notifyAll()方法
    Java 死锁
    线程同步
    Java 创建多线程
    Java 接口
    抽象类和抽象方法
  • 原文地址:https://www.cnblogs.com/assult/p/3597362.html
Copyright © 2011-2022 走看看