TJOI2013 拯救小矮人

2022-08-13 15:57:19 字數 1487 閱讀 7245

一群小矮人掉進了乙個很深的陷阱裡,由於太矮爬不上來,於是他們決定搭乙個人梯。即:乙個小矮人站在另一小矮人的 肩膀上,知道最頂端的小矮人伸直胳膊可以碰到陷阱口。

對於每乙個小矮人,我們知道他從腳到肩膀的高度ai,並且他的胳膊長度為bi。陷阱深度為h。

如果我 們利用矮人1,矮人2,矮人3,。。。矮人k搭乙個梯子,滿足a1+a2+a3+....+ak+bk>=h,那麼矮人k就可以離開陷阱逃跑了,一 旦乙個矮人逃跑了,他就不能再搭人梯了。

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

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

乙個整數表示對多可以逃跑多少小矮人

2

20 10

5 530

2

20 10

5 535

30%的資料 n<=200

100%的資料 n<=2000

貪心 + dp

這題搞了半天

不過貪心思路還是比較妙的雖然我想不出來

我們可以按照身高+臂長來從小到大排序

因為身高+臂長大的一定能比小的後跑

所以我們就讓身高+臂長小的先跑

這樣跑的順序肯定是正確的

但是有的身高+臂長小的在當前人梯高度下跑不了了

那麼就讓更nb跑出來 , 所以要跳過某些人

這樣就只能dp了

設\(f[i]\)表示已經跑走i個小矮人之後人梯最高還能有多高

然後先去列舉每個人

再去列舉跑走幾個人後的人梯高度

如果能跑就更新一下f

如果當前f[i]被更新到了,就說明有i個人已經能跑出去了

就更新一次答案

#include#include#includeconst int m = 2005 ;

using namespace std ;

inline int read()

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

return x*w ;

}int n , m ;

struct node p[m];

inline bool operator < (node a , node b)

int f[m] , tot ;

int main()

m = read() ;

sort(p + 1 , p + n + 1) ;

for(int i = 1 ; i <= n ; i ++)

for(int j = tot ; j >= 0 ; j --)

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

return 0 ;

}

TJOI 2013 拯救小矮人

有 n 個人,每個人有兩個屬性 a i,b i 現在他們要從洞裡逃出去。第 x 個人能逃出去的條件是,隨意選擇一些還在洞裡的人 重新編號為 1.k 滿足 a 1 a 2 a k a x b x ge h 注意,第 x 個人不能在這 k 個人裡。求最多能跑出去多少個人。貪心和 dp 的結合,不得不說是...

TJOI2013 拯救小矮人 排序 dp

題目鏈結 imagine的完美回答 重點大概是證明我們選出要救的小矮人一定可以根據 a i b i 的大小進行排序救出。注意這裡關注的物件是可以保留的高度,所以我們的dp值才會表示成最少減少的高度。includeusing namespace std define go u for int i he...

TJOI2013 松鼠聚會

題目描述 草原上住著一群小松鼠,每個小松鼠都有乙個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。每個小松鼠的家可以用乙個點x,y表示,兩個點的距離定義為點 x,y 和它周圍的8個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y ...