P3480-[POI2009]KAM-Pebbles【阶梯博弈】
生活随笔
收集整理的這篇文章主要介紹了
P3480-[POI2009]KAM-Pebbles【阶梯博弈】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P3480
題目大意
nnn個石頭堆上進行Nim\text{Nim}Nim游戲,不過需要滿足每次操作前后都有ai≤ai+1(i∈[1,n))a_i\leq a_{i+1}(\ i\in[1,n)\ )ai?≤ai+1?(?i∈[1,n)?)
解題思路
讓每一個bi=ai?ai?1b_i=a_i-a_{i-1}bi?=ai??ai?1?就是一個階梯博弈問題了。
階梯博弈問題:nnn堆石頭,第iii堆石頭有aia_iai?個,每次一個玩家可以取走若干個第一堆的石頭,或者將第iii堆的任意個石頭丟到第i?1i-1i?1堆里面。
這個問題的sgsgsg函數就是編號為奇數的石頭數量的異或和,具體證明的話就是如果只看奇數堆石頭,那么轉移奇數的堆里的石頭就相當與去掉一些石頭。所以如果奇數堆必勝的玩家一定會轉移奇數堆的,因為如果后手轉移偶數堆里的那么先手再把新的轉走狀態就不會改變。
所以直接做就好了,時間復雜度O(Tn)O(Tn)O(Tn)
code
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1100; int T,n,a[N]; int main() {scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=n;i>=1;i--)a[i]=a[i]-a[i-1];int ans=0;for(int i=n;i>=1;i-=2)ans^=a[i];puts(ans?"TAK":"NIE");}return 0; }總結
以上是生活随笔為你收集整理的P3480-[POI2009]KAM-Pebbles【阶梯博弈】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P4630-[APIO2018]Duat
- 下一篇: 拼图秀恩爱 带你玩转美图秀秀iPhone