zoukankan      html  css  js  c++  java
  • [洛谷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.
  • 相关阅读:
    Java二维数组
    Java实现冒泡排序
    python类简记
    LaTeX:论文Instruction最后一段的章节引用
    在Adobe IIIustator中加入数学公式——配合MathType使用
    org.springframework.web.bind.annotation不存在
    xshell5 下载安装
    MultipartFile解析Excel
    开源项目环境搭建
    学习路线
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4714578.html
Copyright © 2011-2022 走看看