小公尺 oj 硬幣比賽(思維 動態規劃 博弈)

2021-09-01 04:36:01 字數 1068 閱讀 8571

序號:#47難度:困難時間限制:1000ms記憶體限制:10m

描述有 n 個不同價值的硬幣排成一條線。有 a 與 b 兩個玩家,指定由 a 開始輪流(a 先手,然後 b,然後再 a..)從左邊依次拿走 1 或 2 個硬幣(不能不拿,也不能拿其他個數),直到沒有硬幣為止。最後計算 a 與 b 分別拿到的硬幣總價值,價值高的人獲勝。

請依據硬幣的排列情況來判定,先手的玩家 a 能否找到必勝策略?

輸入使用逗號(,)分隔的乙個正整數陣列,表示這排硬幣的排列情況與對應價值

輸出true 或 false(字元型別),表示玩家 a 能否找到必勝策略

輸入樣例

1,2,2

1,2,4

複製樣例

輸出樣例

true

false

這道題真巧妙啊!!需要逆向思維來想,用動態規劃的思想來做。

設dp[i]為考慮下標從i到n的子陣列中若a先取,b也採取最優策略時,a能取到的最大值,

則最終a是否有必勝策略等價於 dp[0]*2是否》原陣列的sum。(a能取大於總數的一半,

則a必勝)

狀態轉移方程為: dp[i]=max(a[i]+min(dp[i+2],dp[i+3]),a[i]+a[i+1]+min(dp[i+3],dp[i+4]));

上式中取min運算子是由於,對於a的兩種取法,b的取法則是自己取後使得a能得到的價值

最小的方案。

參考**:

#includeusing namespace std;

int read(char *buf,int* num)

return cnt;

}char buf[1000005];

int a[10005];

int dp[10005];

int n;

int main()

}if(2*dp[0]>sum)puts("true");

else puts("false");

}return 0;

}

小公尺 OJ 程式設計比賽 02 月常規賽

carryon 最近迷上了數數字,然後 starry 給了他乙個區間 l,r 然後提了幾個要求,需要將 ll 到 rr 之間的數全部轉化成 16 進製,然後連起來。將連起來的數又轉化成 10 進製。將最終結果對 15 取模。資料範圍 1 l r 1000000000000 單組輸入 l和 r的值 輸...

小公尺 OJ 程式設計比賽 12 月常規賽

小公尺兔跳格仔 序號 119難度 一般時間限制 1000ms記憶體限制 30m 描述公尺兔爸爸為了讓小公尺兔好好鍛鍊身體,便給小公尺兔設定了乙個挑戰 跳格仔。要吃到自己心愛的胡蘿蔔,小公尺兔需要跳過面前一些格仔。現有 nn 個格仔,每個格仔內都寫上了乙個非負數,表示當前最多可以往前跳多少格,胡蘿蔔就...

小公尺OJ 85 搶劫! 動態規劃

描述 你是一名專業劫匪,並且正在計畫搶劫一條街道上的所有房子。每個房子有一定數量的現金。唯一能夠阻止你的就是安保系統被觸發,當有兩個相鄰的房子在同一晚被劫時,安保系統才會自動觸發。現在給你乙個正整數陣列表示每家現金數,請求出這一晚你能在不觸發安保系統時搶到的最大金額。輸入由逗號 分隔的一串正整數,表...