NOI2015模擬9 9 取石子(博弈)

2021-08-15 11:22:38 字數 1604 閱讀 9950

個人覺得這種題要不就切掉要不就爆0了,所以我們要大膽地猜結論,然後去證明。(這也是一種思路吧)

因為一次只能取走一顆石子,因此對於所有石子,我們能進行的操作總數就是 s = 石子總數 + 石子堆數 - 1 .

我們可以感性地先猜一猜,如果考慮最簡單的情況一堆的話,那麼如果s是奇數那麼很顯然先手必勝,若是偶數那麼先手必敗。

那麼我們拓寬一下思路,拓廣到n堆石子。

首先數量為1的石子堆單獨討論,因此我們在統計時候不記錄數量為1的石子堆對答案的貢獻.

看到到資料很小,先考慮記憶化暴力。

我們設f[i][j]表示有i堆石子數目為1,能進行的運算元為j.

f[i][j]為1表示先手必勝,0表示先手必敗.

這樣的狀態設計可以讓我們把數量為1的石子和其他石子分開單獨討論. 這樣我們就可以把數量為1的那些暴力出來.

然後在不考慮大小為1的石子堆的情況下,如果能夠進行的運算元為奇數,則先手必勝,否則後手必勝.

證明如下:

如果只有1堆石子,該結論顯然成立。

如果有多堆石子,每堆石子個數都大於1,並且s為偶數,下面我們證明這樣先手必敗。

1.如果先手選擇合併兩堆石子,那麼每堆石子的個數依然大於1,s變為奇數。

2.如果先手選擇從一堆石子數大於2的堆中拿走一枚石子,那麼同上每堆石子個數依然大於1,s變為奇數。

3.如果先手選擇從一堆石子數等於2的堆中拿走一枚石子,那麼後手可以合併剩下的1枚石子到任意乙個堆。

那樣s的奇偶性不變,每堆石子的個數依然大於1.

綜上所述,結論成立。

暴力時我們這樣操作:

然後可進行的操作有以下幾種:

1.取走乙個大小為1的石子堆的石子.

2.取走某個大小不為1的石子堆的石子或者合併兩個大小不為1的石子堆.

2.將乙個大小為1的石子合併到另乙個大小不為1的石子堆中.

3.合併兩個大小為1的石子堆的石子.

這次題解我難得寫那麼長哎(〃'▽'〃)

~~或許是第一次做博弈切了比較有興趣~~

code

#include 

#include

#include

#include

#include

#define fo(i,a,b) for (int i=a;i<=b;i++)

#define n 60

#define m (50 * 1000 + 5)

using

namespace

std;

int n,f[n][m];

bool mark[n][m];

int read(int &n)

int dfs(int x,int y)

int main()

many --;

many = many > 0 ? many : 0;

printf(dfs(one,many) ? "yes\n" : "no\n");

}return

0;}

NOI2015模擬YYT 傳送

你在乙個有n 個點的環上,環上點按逆時針順序標號為0 到n 1。你一 開始在0 號點。你在每一回合可以使用k 種傳送中的一種,第i 種傳送會將你 按逆時針方向移動ai 個點。有m 個限制條件,對於每個限制條件 xi yi 要 求不能在第xi 步之後在yi 號點上。你要求出經過l 步之後在0 號點的方...

NOI 2015 壽司晚宴

description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n...

NOI 2015 壽司晚宴

4197 noi2015 壽司晚宴 time limit 10 sec memory limit 512 mb submit 813 solved 508 submit status discuss description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 ...