按a+b从小到大排序,a+b小的在上面,先考虑让它逃出去
正确性不会证
感性理解一下,最后一个可以达到的最高高度为a+b,显然它越大越能逃出去
f[i][j] 表示前i个逃出去j个后,剩余的最大高度
如果f[j]+b[i]>=H,f[j+1]=max(f[j]-a[i])
#include#include #include #include using namespace std; #define N 2001 struct node{ int a,b;}e[N]; int f[N]; void read(int &x){ x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }} bool cmp(node p,node q){ return p.a+p.b =0;--j) if(f[j]+e[i].b>=h) f[j+1]=max(f[j+1],f[j]-e[i].a); if(f[ans+1]>=0) ans++; } cout<