博弈论初涉

1.poj 2075 Nim

//瞬秒只要发现要取得那个堆是取后数字是p-positon 当且仅当 异或值小于a[j]

#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <queue> #include <map> #include <algorithm> #include <memory.h> #include <cmath> #include <cstdlib> using namespace std; const int MAX=1005,INF=1<<30; int main() { freopen("i.txt","r",stdin); int n,a[MAX],t,c; while(cin>>n,n){ c=0; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++){ t=0; for(int j=0;j<n;j++){ if(i==j) continue; t^=a[j]; } if(t<a[i]) ++c; } cout<<c<<endl; } return 0; }

2.hdu 2176#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <queue> #include <map> #include <algorithm> #include <memory.h> #include <cmath> #include <cstdlib> using namespace std; const int MAX=200005,INF=1<<30; int ans[MAX][2]; int main() { freopen("i.txt","r",stdin); bool find; int n,t,x,l,a[MAX]; while(cin>>n,n){ find=0; l=t=0; //v.clear(); for(int i=0;i<n;i++){ cin>>a[i]; t^=a[i]; } //for(int i=0;i<n;i++) // t^=a[i]; for(int i=0;i<n;i++){ x=t^a[i]; if(x<a[i]){ find=1; //cout<<a[i]<<" "<<a[i]-x<<endl; ans[l][0]=a[i]; ans[l++][1]=x; } } if(find){ cout<<"Yes"<<endl; for(int i=0;i<l;i++) cout<<ans[i][0]<<" "<<ans[i][1]<<endl; } else cout<<"No"<<endl; } return 0; }

3ural 1023#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <queue> #include <map> #include <algorithm> #include <memory.h> #include <cmath> #include <cstdlib> using namespace std; const int MAX=100000005,INF=1<<30; int main() { freopen("i.txt","r",stdin); int n,L,i,find; while(cin>>n){ for(i=3;i<=n;i++) if(n%i==0) break; printf("%d/n",i-1); } return 0; }

假设有k个纽扣,l为3,则当第二个人面对1,2,3,时为胜利,那么第一个人面对怎样的一个尴尬局面使得他不得不捡纽扣使第二个人面对1,2,3呢,只有一个情况,4! 以此递推,可以这样得到
1 1 1 0 1 1 1 0 1 1 。。。
1 2 3 4 5 6 7 8 9 10。。。
第一行的1代表第二个人赢了,0代表第一个人赢了。
通过分析发现当k%(L+1)==0时,第二个人必赢。

 

你可能感兴趣的:(c,ini)