NOIP2017普及組 跳房子

2021-08-11 06:21:45 字數 1991 閱讀 3337

注:思想學習了wzy的部落格,自己也有感受。

題目描述

跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。跳房子的遊戲規則如下:

在地面上確定乙個起點,然後在起點右側畫n 個格仔,這些格仔都在同一條直線上。每個格仔內有乙個數字(整數),表示到達這個格仔能得到的分數。玩家第一次從起點開始向右跳,跳到起點右側的乙個格仔內。第二次再從當前位置繼續向右跳,依此類推。規則規定:

玩家每次都必須跳到當前位置右側的乙個格仔內。玩家可以在任意時刻結束遊戲,獲得的分數為曾經到達過的格仔中的數字之和。

現在小r 研發了一款彈跳機械人來參加這個遊戲。但是這個機械人有乙個非常嚴重的缺陷,它每次向右彈跳的距離只能為固定的d。小r 希望改進他的機械人,如果他花g 個金幣改進他的機械人,那麼他的機械人靈活性就能增加g,但是需要注意的是,每次彈跳的距離至少為1。具體而言,當g < d時,他的機械人每次可以選擇向右彈跳的距離為d-g, d-g+1,d-g+2,…,d+g-2,d+g-1,d+g;否則(當g ≥ d時),他的機械人每次可以選擇向右彈跳的距離為1,2,3,…,d+g-2,d+g-1,d+g。

現在小r 希望獲得至少k 分,請問他至少要花多少金幣來改造他的機械人。

輸入第一行三個正整數n,d,k,分別表示格仔的數目,改進前機械人彈跳的固定距離,以及希望至少獲得的分數。相鄰兩個數之間用乙個空格隔開。

接下來n 行,每行兩個正整數

輸出共一行,乙個整數,表示至少要花多少金幣來改造他的機械人。若無論如何他都無法獲

得至少k 分,輸出-1。

樣例輸入

7 4 10

2 6

5 -3

10 3

11 -3

13 1

17 6

20 2

樣例輸出

這是今年的壓軸題,感覺比去年那個要難一些。

主要還是因為之前不怎麼明白單調佇列的東西,於是考完了以後,趕緊補一下這方面的知識,現在也覺得這道題也沒這麼可怕了。

說實話,這道題的答案就是列舉出來的。很顯然,暴力是沒用的。我們要找乙個優化的查詢方式,於是就很容易的想到了二分。但是二分的判斷過程中還是要列舉(dp:f[i]=max(f[j]|從j可以跳到i)+當前位置分數)這依然很容易超時,我們又需要乙個高階的方法。就是最近講的用單調佇列優化dp。

維護佇列:對於格仔j,在把f[j]放進去和佇列最後面的元素f[k]比較,如果f[k]《f[j],f[k]就沒有用了;再把不在可走範圍內的去掉,就可以保證最優解並不會超時(隊首)。

//借鑑wzy的思路

#include

#include

#include

#include

#include

#define maxn 500000

using

namespace

std;

deque

q;int read()

while(s>='0'&&s<='9')

return x*f;

}int pos[maxn+5],a[maxn+5],f[maxn+5],n,d,k;

bool check(int g)

while(!q.empty()&&pos[q.front()]+r1//把無法繼續使用的pop掉

q.pop_front();

if(!q.empty()) f[i]=f[q.front()]+a[i];

else f[i]=int_min;

if(f[i]>=k) return

1; }

return0;}

int main()

if(sum//無法到達直接特判

int l=0,r=pos[n],m;

while(l2;

if(check(m)) r=m;

else l=m+1;

}printf("%d\n",r);

return

0;}

NOIP2017普及組正式賽 跳房子

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

noip 2017 普及組 T4 跳房子

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

NOIP2017跳房子(普及T4)

題面傳送門 感覺在pj組放這道題是不是有些難了,難度大於noip2015d2t1那道跳石子 老套路先二分答案 dp f i 表示跳前i個格仔,且停在第i個格仔最大分數 sc i 表示第i個格仔的分數。轉移 f i max f j sc i 前提是從j可以跳到i 顯然,這種時間複雜度太大 需要再次使用...