3174: [Tjoi2013]拯救小矮人
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 840 Solved: 451
[Submit][Status][Discuss]
Description
一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯。即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口。对于每一个小矮人,我们知道他从脚到肩膀的高度Ai,并且他的胳膊长度为Bi。陷阱深度为H。如果我 们利用矮人1,矮人2,矮人3,。。。矮人k搭一个梯子,满足A1+A2+A3+....+Ak+Bk>=H,那么矮人k就可以离开陷阱逃跑了,一 旦一个矮人逃跑了,他就不能再搭人梯了。
我们希望尽可能多的小矮人逃跑, 问最多可以使多少个小矮人逃跑。
Input
第一行一个整数N, 表示矮人的个数,接下来N行每一行两个整数Ai和Bi,最后一行是H。(Ai,Bi,H<=10^5)
Output
一个整数表示对多可以逃跑多少小矮人
Sample Input
样例1
2
20 10
5 5
30
样例2
2
20 10
5 5
35
2
20 10
5 5
30
样例2
2
20 10
5 5
35
Sample Output
样例1
2
样例2
1
2
样例2
1
HINT
数据范围
30%的数据 N<=200
100%的数据 N<=2000
但commonc的blog真心很棒
#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<set>
#include<map>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
void print(int x)
{if(x<0)x=-x,putchar('-');if(x>=10)print(x/10);putchar(x%10+'0');}
const int N=100100;
struct P{int x,y;friend bool operator <(const P &x,const P &y){return x.x+x.y<y.x+y.y;}}p[N];
int n,H;
int f[N];
int main()
{
n=read();
register int i,j,ans=0;
memset(f,-1,sizeof(f));f[0]=0;
for(i=1;i<=n;++i)p[i].x=read(),p[i].y=read(),f[0]+=p[i].x;
sort(p+1,p+1+n);
H=read();
for(i=1;i<=n;++i)
{
for(j=ans;j>=0;j--)
{
if(p[i].y+f[j]>=H)f[j+1]=max(f[j+1],f[j]-p[i].x);
if(f[ans+1]>=0)ans++;
}
}
print(ans);puts("");
return 0;
}
/*
2
20 10
5 5
30
2
2
20 10
5 5
35
1
*/