bzoj3174 TJOI2013 解救小矮人

2021-09-07 13:23:13 字數 1419 閱讀 6250

time limit: 1 sec  

memory limit: 128 mb

submit: 573  

solved: 293

[submit][

status][

discuss]

一群小矮人掉進了乙個非常深的陷阱裡,因為太矮爬不上來,於是他們決定搭乙個人梯。即:乙個小矮人站在還有一小矮人的 肩膀上。知道最頂端的小矮人伸直胳膊能夠碰到陷阱口。

對於每個小矮人,我們知道他從腳到肩膀的高度ai,而且他的胳膊長度為bi。陷阱深度為h。假設我 們利用矮人1,矮人2。矮人3,。。

。矮人k搭乙個梯子,滿足a1+a2+a3+....+ak+bk>=h,那麼矮人k就能夠離開陷阱逃跑了,一 旦乙個矮人逃跑了,他就不能再搭人梯了。

我們希望盡可能多的小矮人逃跑, 問最多能夠使多少個小矮人逃跑。

第一行乙個整數n, 表示矮人的個數。接下來n行每一行兩個整數ai和bi,最後一行是h。(ai。bi,h<=10^5)

乙個整數表示對多能夠逃跑多少小矮人

例子12

20 10

5 530

例子22

20 10

5 535

例子12

例子21

資料範圍

30%的資料 n<=200

100%的資料 n<=2000

貪心+dp

感性地理解一下。a[i]+b[i]較大的小矮人逃跑的能力更強。所以我們要先讓a[i]+b[i]小的人盡可能先逃跑。

於是能夠想到按a[i]+b[i]從小到大排序,然後貪心計算。但這個貪心顯然是有問題的。所以我們考慮用dp解決貪心的不足。

貪心的不足之處在於當前的小矮人的a[i]還會對後面的小矮人產生影響。所以我們能夠令f[i]表示逃跑了i個小矮人剩餘a[i]和的最大值。

在更新f陣列的同一時候也就計算出了答案。

注意:f陣列要逆向更新。

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define maxn 2005

using namespace std;

int n,h,ans,f[maxn];

struct dataa[maxn];

inline int read()

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

return x*f;

}inline bool cmp(data a,data b)

printf("%d\n",ans);

return 0;

}

bzoj3174 TJOI2013 拯救小矮人

time limit 1 sec memory limit 128 mb submit 573 solved 293 submit status discuss 一群小矮人掉進了乙個很深的陷阱裡,由於太矮爬不上來,於是他們決定搭乙個人梯。即 乙個小矮人站在另一小矮人的 肩膀上,知道最頂端的小矮人伸直...

bzoj3174 Tjoi2013 拯救小矮人

description 一群小矮人掉進了乙個很深的陷阱裡,由於太矮爬不上來,於是他們決定搭乙個人梯。即 乙個小矮人站在另一小矮人的 肩膀上,知道最頂端的小矮人伸直胳膊可以碰到陷阱口。對於每乙個小矮人,我們知道他從腳到肩膀的高度ai,並且他的胳膊長度為bi。陷阱深度為h。如果我 們利用矮人1,矮人2,...

BZOJ5334 Tjoi2018 數學計算

time limit 10 sec memory limit 256 mb submit 234 solved 155 小豆現在有乙個數x,初始值為1.小豆有q次操作,操作有兩種型別 1 m x x m 輸出 x mod 2 pos x x 第pos次操作所乘的數 保證第pos次操作一定為型別1,對...