codevs 2075 yh女朋友的危机
题目描述 Description
不知为什么,yh的女朋友们都掉入了一个深度为h的天坑。由于天坑太深,yh的女朋友们无法爬出去,于是她们决定用搭人梯的方式脱困。我们知道yh的每位女朋友从脚到肩膀的高度ai,以及肩膀到伸直手臂的距离bi。由k个人搭成的人梯的高度为a1+a2+…+ak+bk;当人梯高度大于等于h时,第k个人就可以爬出天坑,并再也不进来。你能帮助他的女朋友们安排一个方案,使得最多的女朋友能爬出天坑吗?
输入描述 Input Description
第一行一个整数n,表示有n个女朋友掉进坑里
第2行到第n+1行,每行两个整数,表示女朋友从脚到肩膀的距离ai和从肩膀到伸直手臂的距离bi。
第n+2行为一个整数h,表示天坑深度为h。
输出描述 Output Description
输出一行,一个整数,表示最多能爬出天坑的女朋友的数量
样例输入 Sample Input
2
20 10
5 5
35
样例输出 Sample Output
1
数据范围及提示 Data Size & Hint
对于40%数据,n≤100
对于100%数据,n≤2000,ai,bi,h≤100000
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int f[4001],n,h,ans; struct node { int ax,ay; }a[2001]; bool cmp(const node&x,const node&y) { return x.ax+x.ay<y.ax+y.ay; } int main() { int i,j; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d%d",&a[i].ax,&a[i].ay); scanf("%d",&h); memset(f,-1,sizeof(f)); f[0]=0; for(i=1;i<=n;i++) f[0]+=a[i].ax; sort(a+1,a+n+1,cmp); for(i=1;i<=n;i++) for(j=ans;j>=0;j--) { if(f[j]+a[i].ay>=h) f[j+1]=max(f[j+1],f[j]-a[i].ax); if(f[ans+1]>=0) ans++; } printf("%d",ans); return 0; }