題目鏈結
題目大意:給定\(n\)個格仔離原點距離以及權值,初始單次移動距離只能為\(d\),你可以花費\(g\)枚金幣使得單次移動距離變為\([max(d-g,1),d+g]\)內任意整數,問獲得權值至少為\(k\)最少需要花費多少枚金幣單調佇列
分析:顯而易見答案具有單調性,因為花費金幣越多機械人越靈活,花費金幣少的可行決策是花費金幣多的可行決策的子集
我們可以二分乙個答案\(ans\),如果\(o(n^2)\)做\(dp\)的話可以得到\(50\)分
對於任意乙個位置,它能轉移的位置都在一段區間內,由於每個格仔位置單調遞增,可行轉移狀態集合類似於滑動視窗,可以用單調佇列來維護,做到\(o(n)dp\)
注意初始值
#include #include #include using namespace std;
const int maxn = 5e5 + 100;
typedef long long ll;
struct nodeval[maxn];
int q[maxn],head,tail,n,d,k,l = 0,r = 1e9,ans = -1;
ll f[maxn];
inline bool check(int g)
while(head <= tail && val[q[head]].pos < val[i].pos - r)head++;
if(head <= tail)f[i] = f[q[head]] + val[i].val;
} for(int i = 1;i <= n;i++)
if(f[i] >= k)return true;
return false;
}int main()
printf("%d\n",ans);
return 0;
}
洛谷P3957 跳房子
普及組的題。我不會。題目 思路很簡單,就是二分答案 dp 單調佇列 線段樹也可以 但是要注意細節,乙個細節錯了,一半分數就沒了。引用洛谷上某大佬的一段話 發現答案的可行區間是單調的,所以二分答案,容易推出f i 表示到達第i個格仔的最大值,列舉上一步跳了多少來轉移 然後仔細觀察可以發現對於乙個狀態,...
洛谷P3957 跳房子
跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。跳房子的遊戲規則如下 在地面上確定乙個起點,然後在起點右側畫 n 個格仔,這些格仔都在同一條直線上。每個格仔內有乙個數字 整數 表示到達這個 格仔能得到的分數。玩家第一次從起點開始向右跳,跳到起點右側的乙個格仔內。第二次再從...
洛谷P3957 跳房子
普及組的題.填坑來了。當年的我一眼二分 dp,現在都佩服起自己來了.然後我們就寫個二分,在check裡面寫單調佇列優化dp即可。然後就a了.1 include 2 include 3 include 4 5 typedef long long ll 6 const int n 500010 7 co...