题解:P3957 [NOIP2017 普及组] 跳房子

· · 题解

难道有人看题解不点赞的吗?

题目解析

这道题可以使用二分+动态规划,二分要花的金币数。

每次二分有弹跳距离的下界和上界: $mn=\max(1,d-mid) mx=d+mid

50pts:

简单的 ok 函数:

bool ok(ll g) {
    memset(dp,-0x3f,sizeof(dp));
    dp[0]=0;
    ll ans=0;
    for(ll i=1; i<=n; i++) {
        for(ll j=i-1; j>=0; j--) {
            if(x[i]-x[j]>d+g) break;
            if(x[i]-x[j]>=max(1ll,d-g)) dp[i]=max(dp[i],dp[j]+s[i]);
        }
        ans=max(ans,dp[i]);
    }
    return ans>=k;
}

然后就发现程序超时,只有 50 分。

100pts:

很明显需要优化 ok 函数。
可以发现对于 dp_i 需要维护 [i-mn,i+mx] 的最大值。
欸,这不就是单调队列吗?
对于 dp_i