http://acm.hdu.edu.cn/showproblem.php?pid=2897
題意:一堆石子共n個,A、B兩人輪流從中取,每次取得石子數必須在[p,q]區間,若剩下的石子數少於p個,則當前取者必須全部取完。最後取完石子的人輸。
分析:我看分類的時候他寫着是用sg打表找規律。我就照做了。我腦殘啊。從一堆中取出物體,不就是巴什博弈嗎????
算法分析:
假設先取者爲A,後取者爲B,初始狀態下有石子n個,除最後一次外其他每次取得石子個數必須在[p,q]之間。
- 若當前石子共有n =(p+q)* r個,則A必勝,必勝策略爲:A第一次取q個,以後每次若B取K個,A取(p+q-k)個,如此下去最後必剩下p個給B,所以A必勝。
- 若n =(p+q)* r + left個(1< left <= p)B必勝,必勝策略爲:每次取石子活動中,若A取k個,則B去(p+q-k)個,那麼最後剩下left個給A,此時left <= p,所以A只能一次去完,B勝。
- 若n =(p+q)* r + left個(p < left <= q),則A必勝,必勝策略爲:A第一次取t(1< left – t <= p)個,以後每次B取k個,則A取(p+q-k)個,那麼最後留下1< left – t <= p給B,則A勝。
-
View Code
// I'm lanjiangzhou //C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #include <time.h> //C++ #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <cctype> #include <stack> #include <string> #include <list> #include <queue> #include <map> #include <vector> #include <deque> #include <set> using namespace std; //*************************OUTPUT************************* #ifdef WIN32 #define INT64 "%I64d" #define UINT64 "%I64u" #else #define INT64 "%lld" #define UINT64 "%llu" #endif //**************************CONSTANT*********************** #define INF 0x3f3f3f3f // aply for the memory of the stack //#pragma comment (linker, "/STACK:1024000000,1024000000") //end int main(){ int n,p,q; while(scanf("%d%d%d",&n,&p,&q)!=EOF){ int s; s=n%(p+q); if(s>0&&s<=p) printf("LOST\n"); else printf("WIN\n"); } return 0; }