您的位置:首页 > 其它

[洛谷1478]陶陶摘苹果(升级版)

2015-08-09 09:07 471 查看
题目描述 Description】

  又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次她有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。
  这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0之前最多能摘到多少个苹果。
现在已知n个苹果到达地上的高度xi,椅子的高度a,陶陶手伸直的最大长度b,陶陶所剩的力气s,陶陶摘一个苹果需要的力气yi,求陶陶最多能摘到多少个苹果。

输入输出格式 Input/output】

【输入格式:】
  第1行:两个数 苹果数n,力气s。
  第2行:两个数 椅子的高度a,陶陶手伸直的最大长度b。
  第3行~第3+n-1行:每行两个数 苹果高度xi,摘这个苹果需要的力气yi。
【输出格式:】
只有一个整数,表示陶陶最多能摘到的苹果数。

输入输出样例 Sample input/output】

[b]【输入样例:】[/b]
8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2

【输出样例:】
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: