1. 程式人生 > >nyoj 23-取石子(一)(博弈)

nyoj 23-取石子(一)(博弈)

panel -c 遊戲 tdi print 個數 btn 最小值 accept

23-取石子(一)


內存限制:64MB 時間限制:3000ms Special Judge: No
accepted:20 submit:33

題目描述:

一天,TT在寢室閑著無聊,和同寢的人玩起了取石子遊戲,而由於條件有限,他/她們是用旺仔小饅頭當作石子。遊戲的規則是這樣的。設有一堆石子,數量為N(1<=N<=1000000),兩個人輪番取出其中的若幹個,每次最多取M個(1<=M<=1000000),最先把石子取完者勝利。我們知道,TT和他/她的室友都十分的聰明,那麽如果是TT先取,他/她會取得遊戲的勝利麽?

輸入描述:

第一行是一個正整數n表示有n組測試數據
輸入有不到1000組數據,每組數據一行,有兩個數N和M,之間用空格分隔。

輸出描述:

對於每組數據,輸出一行。如果先取的TT可以贏得遊戲,則輸出“Win”,否則輸出“Lose”(引號不用輸出)

樣例輸入:

2
1000 1
1 100

樣例輸出:

Lose
Win

分析:
  ①、取石子這類的問題自需要考慮最大值M與最小值m(PS:該題中最小可以取1)之和的情況
  ②、如果N%(M+1) > 0 這LL自需要取N%(M+1)就必贏
  ③、剩下的因為是(M+1)的倍數,所以當對手取x的時候,LL可以取M+1-x,醬紫LL就是那個最後取完石子的人

步驟:
  直接分析N%(M + 1) 取余是否不為零,不為零LL必勝,反之他的對手必勝

核心代碼:
1 if(N%(M+!)) printf("Win\n");
2 else printf("Lose\n");

C/C++代碼實現(AC):

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <stack>
10
11 using namespace std; 12 13 int main () 14 { 15 int t; 16 scanf("%d", &t); 17 while(t --) 18 { 19 int a, b; 20 scanf("%d%d", &a, &b); 21 if(a % (b+1)) printf("Win\n"); 22 else printf("Lose\n"); 23 } 24 return 0; 25 }

nyoj 23-取石子(一)(博弈)