zoukankan      html  css  js  c++  java
  • SSL 1637——苹果

    Description

      农场的夏季是收获的好季节。在Farmer John的农场,他们用一种特别的方式来收苹果:Bessie摇苹果树,苹果落下,然后Farmer John尽力接到尽可能多的苹果。
      作为一个有经验的农夫, Farmer John将这个过程坐标化。他清楚地知道什么时候(1<=t<=1,000,000)什么位置(用二维坐标表示,-1000<=x,y<=1000)会有苹果落下。他只有提前到达那个位置,才能接到那个位置掉下的苹果。
      一个单位时间,Farmer John能走s(1<=s<=1000)个单位。假设他开始时(t=0)站在(0,0)点,他最多能接到多少个苹果?

    Input

    第一行:两个整数,N(苹果个数,n<=5000)和S(速度);
    第2..N+1行:每行三个整数Xi,Yi,Ti,表示每个苹果掉下的位置和落下的时间。

    Output

    仅一行,一个数,表示最多能接到几个苹果

    Sample Input

    5 3
    0 0 1
    0 3 2
    -5 12 6
    -1 0 3
    -1 1 2
    Sample Output

    3 (Farmer John可以接到第1,5,4个苹果)


    思路
    先将苹果下落的时间从小到大排序
    然后用dis(i,j)表示两点之间的距离为sqrt(sqr(x1-x2)+sqr(y1-y2))
    如果从第i个苹果到第j个苹果所用的时间小于他的速度*(第i个苹果下落的时间-第j个苹果下落的时间),就f[i]:=max(f[i],f[j]+1)


    代码如下:

    const maxapp=5000;
    type as=record
         x,y,time:longint;
    end;
    
    var f:array [0..maxapp] of longint;
        app:array[0..maxapp] of as;
        n,s:longint;
        i,j,ans:longint;
        m:real;
    
    procedure init;
    var i,j,k:longint;
    begin
       readln(n,s);
       for i:=1 to n do
         readln(app[i].x,app[i].y,app[i].time);
       app[0].x:=0; app[0].y:=0; app[0].time:=0;
    end;
    
    procedure qsort(l,r: longint);
    var i,j,x: longint;
        tmp:as;
    begin
         i:=l;
         j:=r;
         x:=app[(l+r) div 2].time;
         repeat
               while app[i].time<x do inc(i);
               while x<app[j].time do dec(j);
               if not(i>j) then
                 begin
                    tmp:=app[i];
                    app[i]:=app[j];
                    app[j]:=tmp;
                    inc(i);
                    j:=j-1;
                 end;
         until i>j;
         if l<j then qsort(l,j);
         if i<r then qsort(i,r);
    end;
    
    function dis(i,j:longint):real;
    begin
      dis:=sqrt(sqr(app[i].x-app[j].x)+sqr(app[i].y-app[j].y));
    end;
    
    begin
        init;
        qsort(1,n);
        f[0]:=0;
        ans:=0;
        for i:=1 to n do
         begin
           f[i]:=0;
           for j:=0 to i-1 do
            if (j=0)or((j<>0)and(f[j]<>0)) then
               begin
                 m:=dis(i,j);
                 if ( m<=s*(app[i].time-app[j].time) )and( f[j]+1>f[i] )
                    then f[i]:=f[j]+1;
               end;
           if f[i]>ans then ans:=f[i];
         end;
        write(ans);
    end.
  • 相关阅读:
    30条MySQL优化总结
    安装了最新的pycharm不能自动补全的解决方法。路径中输入变成¥的解决方法
    You should consider upgrading via the 'python -m pip install --upgrade pip' command解决方法
    B站MySQL学习之笔记
    B站MySQL学习之job_grades表数据
    B站MySQL学习之student数据
    Faker 造相对真实的测试数据
    浏览器地址栏输入url后的过程
    cookie、session及token的区别
    Get和Post的区别
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412375.html
Copyright © 2011-2022 走看看