苹果_ssl1637_dp

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].tdo 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.

转载于:https://www.cnblogs.com/olahiuj/p/5781293.html

你可能感兴趣的:(苹果_ssl1637_dp)