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