一群小矮人掉進了乙個很深的陷阱裡,由於太矮爬不上來,於是他們決定搭乙個人梯。即:乙個小矮人站在另一小矮人的 肩膀上,知道最頂端的小矮人伸直胳膊可以碰到陷阱口。
對於每乙個小矮人,我們知道他從腳到肩膀的高度ai,並且他的胳膊長度為bi。陷阱深度為h。
如果我 們利用矮人1,矮人2,矮人3,。。。矮人k搭乙個梯子,滿足a1+a2+a3+....+ak+bk>=h,那麼矮人k就可以離開陷阱逃跑了,一 旦乙個矮人逃跑了,他就不能再搭人梯了。
我們希望盡可能多的小矮人逃跑, 問最多可以使多少個小矮人逃跑。
第一行乙個整數n, 表示矮人的個數,接下來n行每一行兩個整數ai和bi,最後一行是h。(ai,bi,h<=10^5)
乙個整數表示對多可以逃跑多少小矮人
220 10
5 530
230%的資料 n<=20020 10
5 535
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 ...