Vijos P1196吃糖果游戏[组合游戏]
描述
Matrix67和Shadow正在做一個小游戲。
桌子上放著兩堆糖果,Matrix67和Shadow輪流對這些糖果進行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成兩堆(可以不相等)留給對方操作。游戲如此進行下去,糖果數會越來越少,最后必將出現這樣一種情況:某人吃掉一堆糖果后發現另一堆里只剩一塊糖果不能再分了。游戲規定此時該操作者吃掉最后這一塊糖果從而取勝。
這個游戲是不公平的。對于任意一種初始狀態,總有一方有必勝策略。所謂有必勝策略是指,無論對方如何操作,自己總有辦法取勝。
Matrix67和Shadow將進行10次游戲,每一次游戲中總是Matrix67先進行操作。Matrix67想知道每一次游戲中誰有必勝策略。
格式
輸入格式
輸入數據一共10行,每行有兩個用空格隔開的正整數,表示一次游戲開始時桌子上兩堆糖果分別有多少個。
對于50%的數據,這些正整數均不超過100;
對于70%的數據,這些正整數均不超過10 000;
對于100%的數據,這些正整數均不超過10 000位。
輸出格式
輸出十行字符串。這些字符串只能是“Matrix67”或“Shadow”,它們表示對應的十行輸入數據中有必勝策略的一方。
請注意大小寫。
樣例1
樣例輸入1[復制]
1 1 1 2 1 3 1 4 1 5 2 1 2 2 2 3 2 4 2 5樣例輸出1[復制]
Matrix67 Matrix67 Matrix67 Matrix67 Matrix67 Matrix67 Shadow Shadow Matrix67 Matrix67限制
各個測試點1s
來源
Matrix67原創
?
規定了獲勝狀態
從(x,1)開始遞推
設(x,a),吃掉x,留下的a分開,如果能分成兩部分c和d使(x,c)和(x,d)都是P狀態,(x,a)就是n狀態;如果不得不存在一個N狀態的,(x,a)就是P狀態
遞推完1...10后>10的%10就行了
還有一種分析:(%Matrix67)
當游戲狀態屬于前者時,Matrix67可以把糖果數被5除余1、4或正好除盡的那一堆分成糖果數被5除余數都是2或3的兩堆(他總能做到這一點),而對方不得不把其中一堆糖果又分出新的糖果數被5除余1、4或正好除盡的一堆留給Matrix67操作。這樣逼著對方總是面臨必敗的狀態,使得最后對方不得不把2個糖果或者3個糖果分成兩堆,從而使Matrix67贏得游戲。反過來,當Matrix67面臨兩堆糖果的數目被5除余數都是2或3的狀態時,Shadow總可以取勝。
?
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=1e4+5,INF=1e9+5; char a[N],b[N]; int main(){for(int i=1;i<=10;i++){scanf("%s%s",a,b);int n=strlen(a)-1,m=strlen(b)-1;char c=a[n],d=b[m];if((c=='2'||c=='3'||c=='7'||c=='8')&&(d=='2'||d=='3'||d=='7'||d=='8')) puts("Shadow");else puts("Matrix67");} }?
?
?
總結
以上是生活随笔為你收集整理的Vijos P1196吃糖果游戏[组合游戏]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spark Summit East 2
- 下一篇: 转:设置Eclipse中的tab键为4个