從最簡單的必勝態入手

2021-07-15 05:02:13 字數 1581 閱讀 8385

hdu 1525

題意:給定兩個正整數a,b。每次操作,可以將大的數減掉小的數的整數倍(減去後不能為負數)。如果乙個操作者,將a,b中乙個數變成0時遊戲結束,並且該玩家勝利。求先手必勝還是後手必勝。

分析:不妨設a>b. ①  若a%b==0先手必勝。

②  若a/b >=2且a%b!=0,即a=b*k+rest ( k>=2 ) ,先手總是能夠使其中一方變成( b,a%b )的結果;

若( b,a%b)為必勝態,則先手操作使對手面臨(a%b+b,b)的狀態,然後自己就一定面對勝態(b,a%b); 

若( b,a%b)  為必敗態,則先手操作使對手面臨(b,a%b)  的狀態,自己獲勝。

③  2b>a>b ,則a =b+rest,先手只能操作變成 (b,a%b),然後 後手按照①②③操作判斷,誰先到達必勝態誰就贏

#include using namespace std;

int main()

if(tag)

cout<<"stan wins"<

poj  1740

有n堆石子,每堆中的數量分別為a1,a2,……,an兩個人輪流操作,每次操作分兩步,第一步從某堆中去掉至少乙個,

第二步,可以把該堆剩餘石子的一部分分給其它的某些堆(可省略)。當乙個人面臨所有堆中的石子都為0時,則他就輸了。任意輸入n堆,和n堆中石子的個數,分析先手勝,還時後手勝。

分析:① n=1時,先手勝。

② n=2時,如果要想自己贏,則要把對方逼到面臨(1,1)的情況,無論對手怎麼操作,自己一定贏。

當a1=a2時,先手先操作,後手模仿前者採取一樣的策略,一定能使某一狀態下先手面臨 (1,1)的情況,故後手必勝。即遇到兩堆相等的情況下,對先手來說是必敗態。

當a1!=a2, 先手一定能使兩堆的數量變成相等,使後手面臨必敗態。先手必勝。

③n=3時,先手操作其中的一堆,使該堆數量為0,且使另外兩堆數量相等,使後手面臨必敗態。先手必勝。

④n>=4時,按從小到大的順序排序

一 、   若n為偶數,分兩種情況 

1. n堆可以分成 n/2  對兩兩數量相等的堆,這樣後者總是模仿先手在同數量的堆中採取一樣的措施,後手必勝。先手必敗。

2. n堆不能分成上述兩兩相等的堆,取最大的一堆,使其數量與數量最小的一堆相等,同時用高度差平衡其他堆,使其他的堆變成兩兩相等的堆,注意一定是可以平衡的。因為把剩餘的堆相鄰兩兩的差值投射到y軸上發現這些離散的線段和

*小於最高堆相對於最小堆的差值。即轉變成必敗態,先手勝。

二、    若n為奇數,則取最大的那一堆來平衡其他堆(使其他堆變成 兩兩相等的堆),並使自身變為0,即轉變成必敗態,故先手勝。

#include #include #define max 10000

using namespace std;

int main()

}if(tag==0)

cout<<"0"

else cout<<"1"<}

return 0;

}

創業應從最簡單的入手

當年沈南鵬求學美國時,mba在中國尚未流行。在哥倫比亞大學乙個博士專案下攻讀一年數學後,沈南鵬定下了自己的目標 轉商學院讀mba。畢業那年,他投身花旗銀行從事投資行業,為自己的留學經歷找到了乙個令許多人羨慕的結果。第一天坐在花旗銀行全球中心,沈南鵬立志要躋身華爾街最成功的銀行家行列。當時的他從未沒想...

從零建立最簡單的 ogre 程式

一般的 ogre 教程貌似都是從已有的例子框架開始建立 ogre 程式的,這篇文章教你從零開始,建立乙個能顯示一條龍的 ogre 程式,這個程式只有最少的 沒有其他功能,方便你理解 ogre 的一些基本概念。開始乙個新的 win32 程式,你可以刪除所有 只需要保留 winmain 的宣告。讓我們從...

簡單的單態寫法

public static gamemanager instance private static gamemanager instance null void awake 使自己成為唯一的例項 instance this 如果存在多關卡切換,就需要加上下面這句 dontdestroyonload ...