求救!(动规)
  • 板块学术版
  • 楼主DevilsFlame
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/8 12:28
  • 上次更新2024/6/8 15:18:33
查看原帖
求救!(动规)
1050431
DevilsFlame楼主2024/6/8 12:28

【问题描述】 农场的夏季是收获的好季节。在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;
}
2024/6/8 12:28
加载中...