一本通1668取石子

2022-05-08 01:51:11 字數 1888 閱讀 6664

時間限制: 1000 ms         記憶體限制: 524288 kb

alice 和 bob 兩個好朋友又開始玩取石子了。遊戲開始時,有 n

'>n

n 堆石子排成一排,然後他們輪流操作(alice 先手),每次操作時從下面的規則中任選乙個:

1、從某堆石子中取走乙個;

2、合併任意兩堆石子。

不能操作的人輸。alice 想知道,她是否能有必勝策略。

第一行輸入 t

'>

t,表示資料組數。

對於每組測試資料,第一行讀入 n

'>

n;接下來 n

'>n

個正整數 a1,

a2,⋯

,an'>a1,a2,⋯,an

,表示每堆石子的數量。

對於每組測試資料,輸出一行。

輸出 yes

'>yes

表示 alice 有必勝策略,輸出 n

o'>n

o 表示 alice 沒有必勝策略。

3

31 1 2

23 4

32 3 5

yes

nono

對於全部資料,t

≤100,n

≤50,a

i≤1000

'>t≤100,n≤50,ai≤1000。t

≤100,n

≤50,a

i≤1000

'>sol:貌似和博弈論沒有半毛錢關係t≤

100,n≤

50,ai

≤1000

'>如果沒有1的堆,那麼判斷一下總算子的奇偶性即可,煩就煩在有1,t≤

100,n≤

50,ai

≤1000

'>題解上說是記搜,分四種情況(具體見注釋),不知道為什麼n=50都能過qaq

#include using

namespace

std;

typedef

intll;

inline ll read()

while

(isdigit(ch))

return (f)?(-s):(s);

}#define r(x) x=read()inline

void

write(ll x)

if(x<10

)

write(x/10

); putchar((x%10)+'0'

);

return;}

#define w(x) write(x),putchar(' ')

#define wl(x) write(x),putchar('\n')

const

int n=55

;int

t;int

n,a[n];

int bo[n][n*1000

];inline

bool dfs(int num1,int

step)

intmain()

if(!cnt)

sum=max(sum,0

);

if(dfs(cnt,sum)) puts("

yes"

);

else puts("no"

); }

return0;

}/*input353

2 1 3

41 1 1 1

21 3

51 2 1 2 2

31 1 1

output

yesyes

yesno

no*/

view code

一本通1664 例 2 取石子遊戲 2

題目描述 有一種有趣的遊戲,玩法如下 玩家 2 人 道具 n 堆石子,每堆石子的數量分別為 x1 x2 xn 規則 遊戲雙方輪流取石子 每人每次選一堆石子,並從中取走若干顆石子 至少取 1 顆 所有石子被取完,則遊戲結束 如果輪到某人取時已沒有石子可取,那此人算負。假如兩個遊戲玩家都非常聰明,問誰勝...

資訊學奧賽一本通 1218 取石子遊戲

時間限制 1000 ms 記憶體限制 65536 kb 提交數 2463 通過數 1138 有兩堆石子,兩個人輪流去取。每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍,最後誰能夠把一堆石子取空誰就算贏。比如初始的時候兩堆石子的數目是25和7。25 7 11 7 ...

佇列(一本通)

這道題重點是關係的轉換和初始化 include include include includeusing namespace std int a 101 記錄接著的的那個節點 int n,m int main int ans void bfs int x,int y int main cout in...