Star Way To Heaven

Star Way To Heaven

题解

    我们如果不能通过这个长方形,则各个引力带肯定可以形成一条从0到m的链,我们只需要求出从0到m的路径上最长的一条边即可。

源码

 

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream> 
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
const double INF=0x3f3f3f3f; 
double n,m;
int k;
double x[6005],y[6005];
double Dis[6005];
bool vis[6005];
#define gc() getchar()
template<typename _T>
inline void read(_T &x)
{
	_T f=1;x=0;char s=gc();
	while(s>'9'||s<'0'){if(s=='-')f=-1;s=gc();}
	while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=gc();}
	x*=f;
}
double Fabs(double x)
{
	if(x<0)
		return -x;
	return x;
}//绝对值
void Swap(int &ix,int &iy)
{
	int t=ix;ix=iy;iy=t;
}//交换两个数
inline double dis(int ix,int iy)
{
	if(ix>iy)
		Swap(ix,iy);
	if(ix==0&&iy==k)
		return m;
	if(ix==0)
		return y[iy];
	if(iy==k)
		return m-y[ix];
	return sqrt(Fabs(x[ix]-x[iy])*Fabs(x[ix]-x[iy])+Fabs(y[ix]-y[iy])*Fabs(y[ix]-y[iy]));
}//求出两点间的距离,0与m,需特殊处理
inline double Min(double x,double y)
{
	if(x>y)
		return y;
	return x;
}//最小值
inline double Max(double x,double y)
{
	if(x>y)
		return x;
	return y;
}//最大值
int main()
{
	scanf("%lf %lf",&n,&m);
	read(k);
	for(int i=1;i<=k;i++)
		scanf("%lf %lf",&x[i],&y[i]);
	k++;
	for(int i=1;i<=k;i++)
		Dis[i]=1000000.0;//初始化
	Dis[0]=0;
	for(int i=1;i<=k;i++)
	{
		double minn=INF;int u=-1;
		for(int j=0;j<=k;j++)
			if(Dis[j]<minn&&!vis[j])
				u=j,minn=Dis[j];//求出当前最小值
		if(u==-1) break;
		vis[u]=true;
		for(int v=1;v<=k;v++)
			if(!vis[v])
				Dis[v]=Min(Dis[v],Max(Dis[u],dis(u,v)));//更新其他的点
	}
	printf("%.9lf",Dis[k]/2.0);
	return 0;
}

 

谢谢!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值