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
思路:
简单的dp,同这道题目极其相似,我们要做的就是排序+改成偶是距离——也就是直线距离——就好了,不知道为什么优化会过不了,神奇神奇
这里是代码/pas:
type
apple=record
x,y,t:longint;
end;
var
m,v:longint;
f:array[0..50000]of longint;
z:array[0..50000]of apple;
function max(x,y:longint):longint;
begin
max:=x;
if y>x then
max:=y;
end;
procedure qsort(l,r:longint);
var
x,y,key:longint;
tmp:apple;
begin
if l>=r then exit;
x:=l;
y:=r;
key:=z[l+random(r-l+1)].t;
repeat
while (z[x].t<key) do inc(x);
while (z[y].t>key) do dec(y);
if x<=y then
begin
tmp:=z[x];
z[x]:=z[y];
z[y]:=tmp;
inc(x);
dec(y);
end;
until x>y;
qsort(l,y);
qsort(x,r);
end;
procedure main;
var
i,j,ans:longint;
begin
ans:=0;
for i:=1 to m do
begin
for j:=0 to i-1 do
if ((f[j]>0)or(j=0))and(sqrt(sqr(z[i].x-z[j].x)+sqr(z[i].y-z[j].y))<=(z[i].t-z[j].t)*v) then
f[i]:=max(f[j]+1,f[i]);
ans:=max(f[i],ans);
end;
writeln(ans);
end;
procedure init;
var
i:longint;
begin
readln(m,v);
for i:=1 to m do
with z[i] do
readln(x,y,t);
end;
begin
init;
qsort(1,m);
main;
end.