列表

详情


NC206659. 樱桃蛋糕

描述

自从上次做了苹果派以来,嘴馋的米咔一直打算购买一些樱桃来做樱桃蛋糕。

米咔居住的森林可以看做是一个二维坐标系,其中米咔的家位于

在这片森林中,米咔和商人的移动速度是相同的,从点移动到的时间花费在数值上等于两点间的曼哈顿距离,即

如果一个人位于点,那么当他
向上走时间,他将会到达
向下走时间,他将会到达
向右走时间,他将会到达
向左走时间,他将会到达
注意,不一定是整数。

现在米咔知道有个商人将会经过这片森林,其中第个商人在0时刻所在的位置为(x_i,y_i),并且每个商人移动的方向都是恒定且已知的。

米咔在时刻位于自己家中,当某个时刻他和一个商人位于同一个点时,他可以向商人购买一篮樱桃,然后返回家中放下这篮樱桃,之后继续去找商人购买樱桃。其中购买和放下樱桃的时间忽略不计。

因为米咔只是一只小精灵,他拿不了两篮或以上的樱桃,所以他每次在外只能购买一篮樱桃后返回。

现在他想知道,自己最多可以购买多少篮樱桃。
四个小时后商人们就会出现在这片森林中,并且时间将从时刻开始,因此你需要抓紧时间计算哦~

输入描述

第一行一个正整数,代表商人的数量。
接下来行三个空格分隔的正整数,分别代表商人在时刻所在的坐标和他移动的方向。



时,代表商人向上移动。
时,代表商人向下移动。
时,代表商人向右移动。
时,代表商人向左移动。

输出描述

仅一行一个正整数代表答案。

示例1

输入:

4
1 1 1
1 1 2
1 1 4
3 3 2

输出:

1

说明:

米咔无法向第一位商人购买樱桃,他可以选择在时刻1到达(1,0)向第二位商人购买樱桃,也可以选择在时刻1到达(0,1)向第三位商人购买樱桃,无论怎么选择他回到家均已经在时刻2,此时第四位商人已经到达(3,1),米咔无法向他购买;米咔也可以仅向第四位商人购买一篮樱桃。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 146ms, 内存消耗: 508K, 提交时间: 2020-05-30 14:36:27

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5010;
int n,d[N];
int x[N],y[N];
double check(int i,int t,int d)
{
	double dx,dy;
	if(d==1) 
	{
		dx=fabs(x[i]); dy=y[i]+t;
		if(dy>0) return -1;
		else 
		{
			if(dy>=dx) return (dx+dy)/2;
			else return -1;
		}
	}
	else if(d==2)
	{
		dx=fabs(x[i]); dy=y[i]-t;
		if(dy<0) return -1;
		else 
		{
			if(dy>=dx) return (dx+dy)/2;
			else return -1;
		}
	}
	else if(d==3)
	{
		dy=fabs(y[i]); dx=x[i]+t;
		if(dx>0) return -1;
		else 
		{
			dx=-dx;
			if(dy<=dx) return (dx+dy)/2;
			else return -1;
		}
	}
	else
	{
		dy=fabs(y[i]); dx=x[i]-t;
		if(dx<0) return -1;
		else 
		{
			if(dy<=dx) return (dx+dy)/2;
			else return -1;
		}
	}
} 
bool st[N];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x[i]>>y[i]>>d[i];
	}
	int ans=0,t=0;
	for(int i=1;i<=n;i++)
	{
		double res=1e9;
		int l;
		for(int j=1;j<=n;j++)
			if(!st[j]&&check(j,t,d[j])!=-1)
			{
				double ch=check(j,t,d[j]);
				if(ch<res)
				{
					res=ch;
					l=j;
				}
			}
		if(res==1e9) break;
		else
		{
			ans++;
			st[l]=1;
			t+=res*2;
		}
	}
	cout<<ans;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 608K, 提交时间: 2020-06-28 16:27:38

#include<bits/stdc++.h>
using namespace std;

struct node
{
	int cost,r;
}R[5005];
bool cmp(node a,node b)
{
	return a.cost<b.cost;
}
int main()
{
	int i,j,ans=0,n,L=0,d;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d%d",&i,&j,&d);
		if(d&1)continue;
		if(d==2&&j>=i)R[L].r=j-i,R[L++].cost=i+j;
		if(d==4&&i>=j)R[L].r=i-j,R[L++].cost=i+j;
	}
	sort(R,R+L,cmp);
	for(i=j=0;i<L;i++)if(j<=R[i].r)ans++,j=R[i].cost;
	printf("%d\n",ans);
}

上一题