求dalao差错orn
查看原帖
求dalao差错orn
13805
Ackoter楼主2021/7/8 15:17

rt,只有10分

做法是枚举??之间的交错,记录时间,然后排序按照时间顺序找出发生的几组撞车(一开始咱理解为东南西北都能走码了半天...)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<list>
#include<map>
using namespace std;
int n,m,bj[1001],lj[1001],f[1001];
struct cow{
	char fx;
	int x,y;
}p[1001];
struct za{
	int t,node,by;
	za(int T=0,int Node=0,int By=0) : t(T),node(Node),by(By)
	{
	}
}q[1000001];
bool cmp(za a,za b)
{
	return a.t<b.t;
}
int finds(int x)
{
	if(f[x]==x) return lj[x];
	return lj[x]+finds(f[x]);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) bj[i]=2147483647,f[i]=i;
	for(int i=1;i<=n;i++)
		cin>>p[i].fx>>p[i].x>>p[i].y;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)//第j头奶牛会不会被第i头阻挡 
		{
			if(i==j) continue;
			if(p[i].fx==p[j].fx)
			{
				if(p[i].x!=p[j].x&&p[i].y!=p[j].y) continue;
				if(p[i].fx=='E'&&p[i].y==p[j].y&&p[i].x>p[j].x) q[++m]=za(p[i].x-p[j].x,j,i); else
					if(p[i].fx=='N'&&p[i].x==p[j].x&&p[i].y>p[j].y)	q[++m]=za(p[i].y-p[j].y,j,i);
			}
			if(p[i].fx=='N'&&p[j].fx=='E'&&p[i].y<=p[j].y&&p[i].x>p[j].x&&p[i].x-p[j].x>p[j].y-p[i].y) q[++m]=za(p[i].x-p[j].x,j,i);	
			if(p[i].fx=='E'&&p[j].fx=='N'&&p[i].x<=p[j].x&&p[i].y>p[j].y&&p[j].x-p[i].x<p[i].y-p[j].y) q[++m]=za(p[i].y-p[j].y,j,i);
		}
	sort(q+1,q+1+m,cmp);
	for(int i=1;i<=m;i++)
	{
		if(bj[q[i].node]<q[i].t) continue;
		if(bj[q[i].by]<q[i].t) continue;
		bj[q[i].node]=q[i].t;
		++lj[q[i].by];
		f[q[i].by]=q[i].node;
	}
	for(int i=1;i<=n;i++) cout<<finds(i)<<endl;
	for(int i=1;i<=m;i++) cout<<q[i].t<<' '<<q[i].node<<' '<<q[i].by<<endl;
	return 0;
}
2021/7/8 15:17
加载中...