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,對...