1. 程式人生 > >POJ1740之構造博弈

POJ1740之構造博弈

從簡單開始,首先,一堆的話先手必勝。

如果有兩堆,則只有兩堆相同的時候先手會輸。若兩堆不同,先手可以造成兩堆相同的局面從而不輸。

如果有三堆,先手可以拿走一堆並製造兩堆相同的情況。

我們發現,將n堆石子排序,如果石子數量對稱,即每種數量的石子有偶數堆,則先手必輸。
因為先手並不能取光所有的,而後手只要模仿先手的行為就能一直有石子可取。

繼續推理,我們會發現只有這種情況先手會輸。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[11
]; int main() { while (scanf("%d",&n)) { if (n==0) return 0; for (int i=1; i<=n; i++) scanf("%d",&a[i]); if (n%2==1) printf("1\n"); else { int i; sort(a+1,a+n+1); for (i=1; i<=n;i +=2) if
(a[i]!=a[i+1]) { printf("1\n"); break; } if (i>n) printf("0\n"); }   } }