3 条题解
-
0
更多博弈论的内容详见OIWIKI
-
0
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
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;}</pre>
- 1
信息
- ID
- 363
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 195
- 已通过
- 51
- 上传者