noip 2017 普及組 T4 跳房子

2021-08-10 22:51:32 字數 2185 閱讀 8621

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

跳房子的遊戲規則如下:

在地面上確定乙個起點,然後在起點右側畫 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 行,每行兩個正整數x_i, s_i,分別表示起點到第i個格仔的距離以及第i個格仔的分數。 兩個數之間用乙個空格隔開。 保證x_i按遞增順序輸入。

輸出格式:

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

輸入樣例#1:

7 4 10

2 65 -3

10 3

11 -3

13 1

17 6

20 2

輸出樣例#1:

2

輸入樣例#2:

7 4 20

2 65 -3

10 3

11 -3

13 1

17 6

20 2

輸出樣例#2:

-1

【輸入輸出樣例 1 說明】

花費 2 個金幣改進後, 小 r 的機械人依次選擇的向右彈跳的距離分別為 2, 3, 5, 3, 4,3, 先後到達的位置分別為 2, 5, 10, 13, 17, 20, 對應 1, 2, 3, 5, 6, 7 這 6 個格仔。這些格仔中的數字之和 15 即為小 r 獲得的分數。

由於樣例中 7 個格仔組合的最大可能數字之和只有 18 ,無論如何都無法獲得 20 分

本題共 10 組測試資料,每組資料 10 分。

對於全部的資料滿足1 ≤ n ≤ 500000, 1 ≤ d ≤2000, 1 ≤ x_i, k ≤ 109, |si| < 105。 對於第 1, 2 組測試資料, n ≤ 10;

對於第 3, 4, 5 組測試資料, n ≤ 500

對於第 6, 7, 8 組測試資料, d = 1

有難度,二分+dp+單調佇列優化

但是 dp方程非常簡單

設 dp[i] 帶表靈活性為 g 時,到第 i 個的最大可得到值

dp[i]=max+a[i].value (max(1,d-g)<=a[i].set-a[j].set<=d+g)

因為只有當靈活性為g時,值在最大的時候,大於要求的分數,才能證明g可行

所以就可以這樣暴力

列舉

for(int i=1;i<=n;i++)dl[500005];

int dp(int g)

return false;

}int half(int l,int r)

return r;

}int main()

ans=half(0,a[n][0]-a[1][0]);

if(ans!=a[n][0]-a[1][0])

printf("%lld",ans);

else printf("-1");

return 0;

}

NOIP2017跳房子(普及T4)

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

NOIP2017普及 t4 魔法陣

includeusing namespace std int v 40005 int w 40050 int a 40005 b 40005 c 40005 d 40005 a x i 第i個魔法品的座標 其實是魔法值,但是我們抽象成數軸 作為a物品的次數 int n,m int main for ...

noip 2017 普及組 T3 棋盤

有乙個m m的棋盤,棋盤上每乙個格仔可能是紅色 黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。任何乙個時刻,你所站在的位置必須是有顏色的 不能是無色的 你只能向上 下 左 右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你不需要花費金幣 如果不同,則你需...