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;
}