[洛谷1478]陶陶摘苹果(升级版)
【题目描述 Description】
又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次她有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。
这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0之前最多能摘到多少个苹果。
现在已知n个苹果到达地上的高度xi,椅子的高度a,陶陶手伸直的最大长度b,陶陶所剩的力气s,陶陶摘一个苹果需要的力气yi,求陶陶最多能摘到多少个苹果。
这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0之前最多能摘到多少个苹果。
现在已知n个苹果到达地上的高度xi,椅子的高度a,陶陶手伸直的最大长度b,陶陶所剩的力气s,陶陶摘一个苹果需要的力气yi,求陶陶最多能摘到多少个苹果。
【输入输出格式 Input/output】
【输入格式:】
第1行:两个数 苹果数n,力气s。
第2行:两个数 椅子的高度a,陶陶手伸直的最大长度b。
第3行~第3+n-1行:每行两个数 苹果高度xi,摘这个苹果需要的力气yi。
【输出格式:】
只有一个整数,表示陶陶最多能摘到的苹果数。
第1行:两个数 苹果数n,力气s。
第2行:两个数 椅子的高度a,陶陶手伸直的最大长度b。
第3行~第3+n-1行:每行两个数 苹果高度xi,摘这个苹果需要的力气yi。
【输出格式:】
只有一个整数,表示陶陶最多能摘到的苹果数。
【输入输出样例 Sample input/output】
【输入样例:】
8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2
【输出样例:】
4
4
【说明 description】
所有数据:n<=5000 a<=50 b<=200 s<=1000 xi<=280 yi<=100
【思路】
本来我以为这个题是DP,对于苹果有取和不取两种状态,像是一种背包模型,后来发现转移方程几乎写不出来。再后来发现只要在读入的时候做一次预处理,再快排费得体力值,最后累加器累加超过退出就可以了。时间复杂度反而是在排序上,O(N*logN)。
type apple=record x1,y1:longint; end; //xx是高度,yy是力气 var app:array[1..1000] of apple; n,s,a,b,xx,yy,i:longint; sum:longint=0; sum1:longint=0; ans:longint=0; procedure sort(l,r: longint); var i,j,x:longint;y:apple; begin i:=l; j:=r; x:=app[(l+r) div 2].y1; repeat while app[i].y1<x do inc(i); while x<app[j].y1 do dec(j); if not(i>j) then begin y:=app[i]; app[i]:=app[j]; app[j]:=y; inc(i); j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; begin readln(n,s); readln(a,b); for i:=1 to n do begin readln(xx,yy); if a+b>=xx then begin inc(sum); app[sum].x1:=xx; app[sum].y1:=yy; end; end; sort(1,sum); for i:=1 to sum do begin inc(sum1,app[i].y1); if sum1<=s then inc(ans) else break; end; writeln(ans); end.