【问题描述】 农场的夏季是收获的好季节。在John的农场,他们用一种特别的方式来收苹果:Bessie摇苹果树,苹果落下,然后John尽力接到尽可能多的苹果。作为一个有经验的农夫,John将这个过程坐标化。他清楚地知道什么时候(1<=t<=1,000,000)什么位置(用二维坐标表示,-1000<=x,y<=1000)会有苹果落下。他只有提前到达那个位置,才能接到那个位置掉下的苹果。一个单位时间,John能走s(1<=s<=1000)个单位。假设他开始时(t=0)站在(0,0)点,他最多能接到多少个苹果?
【样例】
apples.in
5 3
0 0 1
0 3 2
-5 12 6
-1 0 3
-1 1 2
apples.out
3
#include<bits/stdc++.h>
using namespace std;
int n,v,ans,f[1010];
struct Node
{
int x,y,t,z;
}s[1010];
bool cmp(Node a,Node b)
{
return a.t < b.t;
}
int main()
{
freopen("apples.in","r",stdin);
freopen("apples.out","w",stdout);
scanf("%d %d",&n,&v);
for(int i = 1;i <= n;i ++)
{
scanf("%d %d %d",&s[i].x,&s[i].y,&s[i].t);
s[i].z = s[i].y - s[i].x;
}
sort(s + 1,s + 1 + n,cmp);
// for(int i = 1;i <= n;i ++)
// {
// printf("%d %d\n",s[i].z,s[i].t);
// }
for(int i = 1;i <= n;i ++)
{
for(int j = 0;j < i;j ++)
{
if(ceil(1.0 * abs(s[i].z - s[j].z) / v) <= s[i].t - s[j].t)
{
f[i] = max(f[i],f[j] + 1);
// printf("%d ",f[i]);
}
}
ans = max(ans,f[i]);
// cout << '\n';
}
printf("%d\n",ans);
return 0;
}