3 条题解

  • 0
    @ 2026-8-28 16:10:03

    更多博弈论的内容详见OIWIKI

    • 0
      @ 2025-10-8 16:49:59

      G58 尼姆(Nim)游戏【博弈论】

      scy教学版:

      #include<bits/stdc++.h>
      using namespace std;
        
      int a[11000],n,ans;
      int d[35];
      int f[35],b[35],len;
      int main()
      {
       //   freopen("nim.in","r",stdin);  freopen("nim.out","w",stdout);
          d[1]=1; for(int i=2;i<=31;i++) d[i]=d[i-1]*2;//d[i]表示2^(i-1),也就是二进制从右到左的第i位的十进制值 
        
          while(scanf("%d",&n)!=EOF)
          {
              ans=0;
              memset(f,0,sizeof(f));
              for(int i=1;i<=n;i++)
              {
                  scanf("%d",&a[i]);
                  ans^=a[i];
                  for(int j=1;j<=31;j++)
                     if(a[i]&d[j]) f[j]++;
              }
              if(ans==0) printf("First Lose\n");
              else
              {
                  printf("First Win\n"); 
                  len=0;for(int i=1;i<=31;i++)  if(f[i]%2==1)b[++len]=i;//b数组存储全局的矛盾位 
                  for(int i=1;i<=n;i++)
                  {
                      int w=31; while( (d[w]&a[i])==0 ) w--;
                      if(w<b[len]) continue;//表示第i堆石头无法一步改变全局为平衡状态 
                      int s=0;
                      for(int j=1;j<=len;j++)
                      {
                          if(a[i]&d[b[j]])
                               s=s+d[b[j]];
                          else
                               s=s-d[b[j]];
                      }
                      if(s<=a[i]&&s>0) printf("%d %d\n",i,s);
                  }
              }
          }
          return 0;
      }
      
      • 0
        @ 2025-10-8 16:49:47

        G58 尼姆(Nim)游戏【博弈论】

        scy教学版:

        #include<bits/stdc++.h>
        using namespace std;

        int a[11000],n,ans; int d[35]; int f[35],b[35],len; int main() { // freopen("nim.in","r",stdin); freopen("nim.out","w",stdout); d[1]=1; for(int i=2;i<=31;i++) d[i]=d[i-1]*2;//d[i]表示2^(i-1),也就是二进制从右到左的第i位的十进制值

        while(scanf("%d"&#44;&amp;n)!=EOF)
        {
            ans=0;
            memset(f&#44;0&#44;sizeof(f));
            for(int i=1;i&lt;=n;i++)
            {
                scanf("%d"&#44;&amp;a[i]);
                ans^=a[i];
                for(int j=1;j&lt;=31;j++)
                   if( a[i]&amp;d[j] ) f[j]++;
            }
            if(ans==0) printf("First Lose\n");
            else
            {
                printf("First Win\n"); 
                len=0;for(int i=1;i&lt;=31;i++)  if( f[i]%2==1)b[++len]=i;//b数组存储全局的矛盾位 
                for(int i=1;i&lt;=n;i++)
                {
                    int w=31; while( (d[w]&amp;a[i])==0 ) w--;
                    if(w&lt;b[len]) continue;//表示第i堆石头无法一步改变全局为平衡状态 
                    int s=0;
                    for(int j=1;j&lt;=len;j++)
                    {
                        if(a[i]&amp; d[ b[j] ])
                             s=s+ d[ b[j] ];
                        else
                             s=s- d[ b[j] ];
                    }
                    if(s&lt;=a[i]&amp;&amp;s&gt;0) printf("%d %d\n"&#44;i&#44;s);
                }
            }
        }
        return 0;
        

        }</pre>

        • 1

        G58_2 尼姆(Nim)游戏*【博弈SG】Nim取石子游戏3[P1247微改]

        信息

        ID
        363
        时间
        1000ms
        内存
        128MiB
        难度
        7
        标签
        递交数
        195
        已通过
        51
        上传者