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

 
题目描述 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】
【输入样例:】

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.

 

posted on 2015-08-09 09:07  川汉唐  阅读(666)  评论(1编辑  收藏  举报

导航