bzoj3174 TJOI2013 拯救小矮人

2021-07-11 04:38:58 字數 1365 閱讀 1027

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)

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

樣例1220 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 拯救小矮人

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

bzoj3174 TJOI2013 解救小矮人

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

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