6.sg函式
題目一般是兩人輪流每次在一堆n個物品中拿取不超過m個且至少拿乙個(1~m個),拿光者勝出。
if
(n%(m+1)
!=0)printf
("先手勝利\n");
else
printf
("後手勝利"
);
一般題目是在一堆n個數量的物品中兩人輪流取,每次至少取1個,但是每次取的數量不能超過上次取的數目的兩倍(n>=2且第一次取的時候不能取完)。
int f[maxn]
;void
init()
}
題目一般是有兩堆物品,兩個人輪流從一堆物品裡面拿若干個物品或者從兩堆中拿相同數量的物品。
最後取光者勝出或者無法取者失敗。
必勝樣例:
<0,0>,<1,2>,< 3,5>,
<4,7>,<6,10>,<8,13>;
令a[i]為兩堆中較小堆物品數量,令b[i]為較大堆物品數量。
我們可以發現b[i]=a[i]+i;a[i]為之前的序對中未出現的值的最小值。(m-n)*((sqrt(5)+1)/2.0)==n(當m-n的差值極大時,我們就要對 (sqrt(5)+1)/2.0 進行高精度處理)
if
(m < n)
swap
(m, n)
;ll k = m - n;
ll l =(1
+sqrt(5
))* k*
1.0/
2.0;
ll r =(3
+sqrt(5
))* k *
1.0/
2.0;
if(r==m&&l==n)
printf
("0\n");
else
printf
("1\n"
);
題目一般是在n堆物品中,每人每次只能在一堆裡面至少拿乙個,無上限,當取完最後乙個時該人獲勝。
結論:對每一堆的數量進行異或運算,當結果是0時先手必敗。
int ans=0;
for(int i=
1;i<=n;i++)if
(ans==0)
printf
("先手必輸"
);else
printf
("後手必輸"
);求問先手那第一次時有幾種勝利方法:
int sum =
0;int ans =0;
for(int i =
1; i <= n;i++
)for
(int i =
1; i <= n;i++
)
題目一般是在n堆物品中,每人每次只能在一堆裡面至少拿乙個,無上限,當取完最後乙個時該人失敗。
解決方法:計算所有堆中充裕堆的數目cnt(充裕堆指每堆的數量大於1),以及所有堆數量的異或ans;
如果 ans == 0 && cnt == 0 或者 ans != 0 && cnt != 0 先手必勝,否則後手必勝。
int ans=
0,cnt=
0,n,sum;
for(int i=
1;i<=n;i++)if
(ans==
0&&cnt==
0||ans!=
0&&cnt!=0)
else
printf
("後手必勝"
);
奇異局勢—所有堆的異或和為0,s為非奇異局勢,t為奇異局勢
一堆中石子數量》=2為充裕堆,=1為孤單堆。
s0表示非奇異局勢下,充裕堆為0的狀態堆
s1表示非奇異局勢下,充裕堆為1的狀態堆
s2表示非奇異局勢下,充裕堆》=2的狀態堆
t0表示奇異局勢下,充裕堆為0的狀態堆
t1不存在
t2表示奇異局勢下,充裕堆》=2的狀態堆
性質:1.s能轉化成s、t,t只能轉化成s
2.t0、s1、s2必勝,s0、t2必敗。
求巴什遊戲(一堆石頭)/尼姆遊戲(n堆石頭)
sg函式表示沒有指定給它的任意後繼點的sg值的最小非負整數,sg(x)=0表示為必敗點,即p-position點
void
getsg()
for(int j=
0;j<=n;j++)}
}}
(1)計算每一堆石頭的sg值
(2)求所有石頭sg值的異或,若結果為0,先手必敗。
測試型別基礎總結
1 整合測試 1 自底向上 先測試底層部件 單元和模組,然後向上實現整合測試。最底層使用樁 驅動程式進行測試 樁 驅動程式是為特定目的而設計的,使用他們之前需要先對他們進行測試,通常是編寫的 樁模擬被呼叫函式的片段,驅動程式是模擬呼叫函式的 片段。優點 可以測試到每個元件的正確性,增量式整合中很有效...
Python基礎型別總結
一 基礎型別 1 數字 整數 int 長整數 long 浮點數 float 2 字串 1 文字str。單雙引號沒有任何區別。三引號區分多行字串 2 位元組 bytes 3 布林 true false 二 資料集 1 列表 list 資料集合,索引排序,方便增刪改查。2 元祖 tuple有序不可變資料...
基礎博弈 理解
這裡的博弈,即兩個人輪流進行決策的非合作博弈,並且兩人都使用最優策略來獲取勝利,遵循相同的規則且均不會出現失誤,博弈的次數是有限的。1.巴什博弈 bash game 只有一堆n塊石子,兩個人輪流取石子,規定每次最少取1個,最多取m個,最終先取完者獲勝。通常來想,如果n m 1,那麼無論先取者拿走多少...