BZOJ 2940: [Poi2000]條紋(Multi-Nim)
阿新 • • 發佈:2018-02-25
urn post () 不同 while scu 以及 OS ons Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 110 Solved: 70
[Submit][Status][Discuss]
寫一個程序:
l 讀入條紋的尺寸以及至少一個棋盤的尺寸。
l 對每一個給出的棋盤判斷先手是否必勝。
l 將結果輸出。
1 5 1
3
1
5
6
1
1
2
Submit: 110 Solved: 70
[Submit][Status][Discuss]
Description
條紋遊戲是一個雙人的遊戲。所需要的物品有一個棋盤以及三種顏色的長方形條紋,這三種顏色分別是紅色、綠色和藍色。所有的紅色條紋的尺寸是c*1,所有的綠色條紋的尺寸是z*1,所有的藍色條紋的尺寸是n*1,這裏c,z,n是正整數。每種顏色的條紋每個遊戲者都擁有無限多個。 一個棋盤是一個尺寸為p*1的長方形,由p個1*1的方格組成。 遊戲者輪流走,每一步都是由一個遊戲者任選一種長方形條紋覆蓋到棋盤上,並要求遵循以下規則: l 條紋不能伸出棋盤之外。 l 不能覆蓋在已有的條紋之上(即使部分也不行)。 l 條紋的邊緣必須與棋盤方格的邊緣相重疊。誰不能再走,誰就輸了。 先手是指在遊戲中第一個走的遊戲者。那麽是否不管後手怎麽走,先手都有必勝策略呢? 任務:Input
第一行包含三個整數c,z,n(1<=c,z,,n<=1000),表示三種條紋的長度,依次為紅色,綠色以及藍色。每兩個數之間都用空格隔開。 文件的第二行包括一個整數m(1 <= m <= 1000)表示需要考慮的不同棋盤個數。以下3到m+2行每行包括一個整數p(1<=p<=1000)。第i+2行表示第i個棋盤的長度。Output
應當包含m行。只有一個數字應當被寫入文件的第i行: l 1—如果對第i個棋盤先手有必勝策略。 l 2—其它。Sample Input
3
1
5
6
Sample Output
1
1
2
HINT
Source
隨便yy了一個做法交上去居然A了QWQ....
這題的模型應該是類似於Multi-Nim。
對於拆出來的遊戲的SG異或起來就是當前遊戲的SG
然後枚舉3個線段放在哪兒。
#include<cstdio> #include<cstring> const int MAXN=1001; inline int read() { char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f; } int f[4],N=1001,SG[MAXN],S[MAXN]; int main() { #ifdef WIN32 freopen("a.in","r",stdin); #else #endif for(int i=1;i<=3;i++) f[i]=read(); for(int i=1;i<=N;i++) { memset(S,0,sizeof(S)); for(int j=1;j<=3&&f[j]<=i;j++) for(int k=0;k<=i-f[j];k++) S[ SG[k]^SG[i-k-f[j]] ] =1; for(int j=0;;j++) if(!S[j]) {SG[i]=j;break;} } int QwQ=read(); while(QwQ--) { int p=read(); puts(SG[p]?"1":"2"); } return 0; }
BZOJ 2940: [Poi2000]條紋(Multi-Nim)