本地运行答案正确但交上去只有20pts
查看原帖
本地运行答案正确但交上去只有20pts
564883
sjr3065335594楼主2023/7/25 16:52

这是我的代码

#include <bits/stdc++.h>
#define ll long long
#define mkp(x,y) make_pair(x,y)
using namespace std;
const int N=1e5+5;
const int M=1e6+5;
struct EDGE
{
	int v,next;
	double c;
}edge[M];
int head[N],cnt,n,m,tot;double dist[N],f[405][405];
void add_edge(int x,int y,double z)
{
	edge[++cnt]=(EDGE){y,head[x],z};
	head[x]=cnt;
}
struct Node
{
	double x,y; 
}air[N];
int s,t,a,b,T[N];
double dis(Node a,Node b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
const double eps=1e-6;
Node get_point(Node a,Node b,Node c)
{
	Node d;
	double disab=dis(a,b);
	double disbc=dis(b,c);
	double disac=dis(a,c);
	double maxdis=max(disab,max(disac,disbc));
	if(disab-maxdis>-eps)
	{
		Node mid;
		mid.x=1.0*(a.x+b.x)/2;
		mid.y=1.0*(a.y+b.y)/2;
		if(mid.x-c.x==0)
		{
			d.y=mid.y+mid.y-c.y,d.x=c.x;
			return d;
		}
		double k=(mid.y-c.y)/(mid.x-c.x),l=c.y-k*c.x;
		d.x=mid.x+mid.x-c.x;
		d.y=k*d.x+l;
	}
	if(disbc-maxdis>-eps)
	{
		Node mid;
		mid.x=1.0*(b.x+c.x)/2;
		mid.y=1.0*(b.y+c.y)/2;
		if(mid.x-a.x==0)
		{
			d.y=mid.y+mid.y-a.y,d.x=a.x;
			return d;
		}
		double k=(mid.y-a.y)/(mid.x-a.x),l=a.y-k*a.x;
		d.x=mid.x+mid.x-a.x;
		d.y=k*d.x+l;
	}
	if(disac-maxdis>-eps)
	{
		Node mid;
		mid.x=1.0*(a.x+c.x)/2;
		mid.y=1.0*(a.y+c.y)/2;
		if(mid.x-b.x==0)
		{
			d.y=mid.y+mid.y-b.y,d.x=b.x;
			return d;
		}
		double k=(mid.y-b.y)/(mid.x-b.x),l=b.y-k*b.x;
		d.x=mid.x+mid.x-b.x;
		d.y=k*d.x+l;
	}
	return d;
}
int main()
{
	cin>>n;
	while(n--)
	{
		double ans=100000000000;
		cin>>s>>t>>a>>b;
		tot=0;
		for(int i=1;i<=400;i++)
			for(int j=1;j<=400;j++)
				f[i][j]=1000000000000;
		for(int i=1;i<=400;i++)
			f[i][i]=0;
		for(int i=1;i<=s;i++)
		{
			for(int j=1;j<=3;j++)
			{
				tot++;
				cin>>air[tot].x>>air[tot].y;
			}
			cin>>T[i];
			air[++tot]=get_point(air[tot-1],air[tot-2],air[tot-3]);
			for(int j=1;j<4;j++)
				for(int k=j+1;k<=4;k++)
				{
					int fr=4*(i-1)+j,to=4*(i-1)+k;
					double d=dis(air[fr],air[to]);
					f[fr][to]=f[to][fr]=d*T[i];
				}
		}
		for(int i=1;i<=s;i++)
		{
			for(int j=1;j<=s;j++)
			{
				if(i!=j)
				{
					for(int k=1;k<=4;k++)
						for(int l=1;l<=4;l++)
						{
							int u=(i-1)*4+k,v=(j-1)*4+l;
							double d=dis(air[u],air[v]);
							f[u][v]=f[v][u]=d*t;
						}
				}
			}
		}
		for(int k=1;k<=4*s;k++)
			for(int i=1;i<=4*s;i++)
				for(int j=1;j<=4*s;j++)
					f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
		for(int i=(a-1)*4+1;i<=a*4;i++)
			for(int j=(b-1)*4+1;j<=b*4;j++)
				ans=min(ans,f[i][j]);
		cout<<fixed<<setprecision(1)<<ans<<endl;
	}
	return 0;
}

我使用的是DEV-C++,能够正确编译运行。

本题中有一组数据

输入
1
3 10 1 3
2 2 2 1 1 2 10
2 12 12 2 22 12 1
22 22 22 32 32 22 10
输出
214.1

本地运行正确但在洛谷在线IDE以及洛谷评测均为WA。

2023/7/25 16:52
加载中...