CF30D
CF30D
计算几何 + 贪心
题意
有
题解
首先考虑起始点是第
答案无非两种:
再考虑当起点处在数轴上时的情况:
一定存在
或者先走遍
从点
最佳方案显然是从
从点
代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int k,i,j,n;
double ans,x[100010],xp,yp,xk;
double C(int z){ return hypot(x[z]-xp,yp); }
double A(int l,int r){ return x[r]-x[l]+min(C(l),C(r)); } //l->r->p
double B(int l,int r){ return x[r]-x[l]+min(abs(xk-x[l])+C(r),abs(xk-x[r])+C(l)); }//k->l->r->p
void inlinework(){ //给定起点在轴上
ans=B(1,n); //起点为断点的情况
for (i=2;i<=n;i++){ //从2开始
double t=min(A(1,i-1)+B(i,n),A(i,n)+B(1,i-1));
if (t<ans) ans=t;
}
}
void outlinework(){ //给定起点就是轴外点时必为最优
ans=A(1,n);
}
int main()
{
freopen("kings.in","r",stdin);
freopen("kings.out","w",stdout);
scanf("%d%d",&n,&k);
for (i=1;i<=n;i++) scanf("%lf",&x[i]);
scanf("%lf%lf",&xp,&yp);
xk=x[k];
sort(x+1,x+n+1);
if (k<=n) inlinework();
else outlinework();
printf("%.20lf\n",ans);
}