SSL 1637——蘋果

include_zzy發表於2017-03-11

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.

相關文章