P3957 跳房子 單調佇列,dp,二分

2021-08-20 20:23:36 字數 1022 閱讀 2694

這就是之前普及組的第四題…

有n個格仔,每個格仔有價值。機械人有固定的跳躍距離d,用k個金幣改進的話,就可以讓跳躍距離在d-k到d+k之間,不過至少要往前跳1個單位長度,每次都必須跳到格仔上。要求超過需要的價值求需要消耗的最少金幣。

二分所需金幣數然後

dp,f[i

] f[i

]表示跳到第i個格仔最大價值,然 後f

[i]=

f[ma

x:f[

l]..

.f[r

];]+

c[i]

f [i

]=f[

max:

f[l]

...f

[r];

]+c[

i]

,這個簡單的方程就不解釋了,然後單調佇列維護ma

x:f[

l]..

.f[r

];m ax

:f[l

]...

f[r]

;

#include

#include

#include

using namespace std;

int f[500001],x[500001],c[500001],q[500001];

int n,d,k,l,r,mid;

bool answer()

while (head<=tail&&x[q[head]]+farst//將已經無法跳到的退出

if (head<=tail&&f[q[head]]!=-2333333) f[i]=f[q[head]]+c[i];

else f[i]=-2333333;//金鑰,表示無法到達

if (f[i]>=k) return

1;//已經可以退出

}return0;}

int main()

if (l>x[n]) printf("-1");

else

printf("%d",l);

}

P3957 跳房子 二分答案 dp 單調佇列

前年pj沒去年難好吧 首先要發現這個答案是有單調性的。這個很顯然了 氪金越多遊戲越容易玩,氪金越少越難。然而也有界限 如果所有正數的和加起來還不夠需求,無解。所以二分答案,考慮如何判定答案。是人都知道要設乙個 dp i 表示跳前 i 個房子的最大分數。50pts就很簡單的暴力轉移 dp i max ...

題解 P3957 跳房子

題目鏈結 題目大意 給定 n 個格仔離原點距離以及權值,初始單次移動距離只能為 d 你可以花費 g 枚金幣使得單次移動距離變為 max d g,1 d g 內任意整數,問獲得權值至少為 k 最少需要花費多少枚金幣 單調佇列 分析 顯而易見答案具有單調性,因為花費金幣越多機械人越靈活,花費金幣少的可行...

洛谷P3957 跳房子

普及組的題。我不會。題目 思路很簡單,就是二分答案 dp 單調佇列 線段樹也可以 但是要注意細節,乙個細節錯了,一半分數就沒了。引用洛谷上某大佬的一段話 發現答案的可行區間是單調的,所以二分答案,容易推出f i 表示到達第i個格仔的最大值,列舉上一步跳了多少來轉移 然後仔細觀察可以發現對於乙個狀態,...