NOIP2017跳房子(普及T4)

2021-08-11 07:40:32 字數 1212 閱讀 3194

題面傳送門

感覺在pj組放這道題是不是有些難了,難度大於noip2015d2t1那道跳石子

老套路先二分答案+dp

f[i]表示跳前i個格仔,且停在第i個格仔最大分數;

sc[i]表示第i個格仔的分數。

轉移:f[i]=max(f[j])+sc[i] 前提是從j可以跳到i

顯然,這種時間複雜度太大

需要再次使用單調佇列優化

發現轉移中j的位置是隨著i的右移而右移的

對於格仔j,如果dis[i]-dis[j]>=機械人能跳的最小距離,顯然f[j]是可以進隊的

但是要維護整個佇列單調遞減,每次直接去隊頭就好了

注意要把最小值置極小,否則會wa

#include

#define rep(i,a,b) for(register int i=a;i<=b;i++)

#define dep(i,a,b) for(register int i=a;i>=b;i--)

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

using

namespace

std;

const ll maxn=5e5+6,inf=1844387848000;

ll dis[maxn],sc[maxn],f[maxn],n,d,k,x,y;

bool check(int x)

while(!que.empty()&&dis[que.front()]+steprif(!que.empty())f[i]=f[que.front()]+sc[i];

else f[i]=-inf;

if(f[i]>=k) return

1; }

return0;}

int main()

if(sumcout

<<"-1\n";return

0;} int l=1,r=dis[n],mid;

while(l0);

mid=(l+r)/2;

if(check(mid))r=mid;

else l=mid+1;

}cout

0;}

noip 2017 普及組 T4 跳房子

跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。跳房子的遊戲規則如下 在地面上確定乙個起點,然後在起點右側畫 n 個格仔,這些格仔都在同一條直線上。每個格仔內有乙個數字 整數 表示到達這個格仔能得到的分數。玩家第一次從起點開始向右跳,跳到起點右側的乙個格仔內。第二次再從當...

NOIP2017普及組 跳房子

注 思想學習了wzy的部落格,自己也有感受。題目描述 跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。跳房子的遊戲規則如下 在地面上確定乙個起點,然後在起點右側畫n 個格仔,這些格仔都在同一條直線上。每個格仔內有乙個數字 整數 表示到達這個格仔能得到的分數。玩家第一次從起...

NOIP2017普及組正式賽 跳房子

這一題很有它的價值,我都要認真思考一番才能夠想到方法。先講一下題目大意 題目描述 跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。跳房子的遊戲規則如下 在地面上確定乙個起點,然後在起點右側畫 n 個格仔,這些格仔都在同一條直線上。每個格仔內有乙個數字 整數 表示到達這個格...