苹果
Time Limit:10000MS Memory Limit:65536K
Total Submit:199 Accepted:72
Case Time Limit:1000MS
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个苹果)
Source
elba
const maxapp=5000;
type pointype=record
x,y,time:longint;
end;
var f:array [0..maxapp] of longint;
app:array[0..maxapp] of pointype;
n,s:longint;
i,j,ans:longint;
m:real;
procedure readata;
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 sort(l,r: longint);
var i,j,x: longint;
tmp:pointype;
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 sort(l,j);
if i<r then sort(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
readata;
sort(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.