這就是之前普及組的第四題…
有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個格仔的最大值,列舉上一步跳了多少來轉移 然後仔細觀察可以發現對於乙個狀態,...