题意从第k个点出发遍历所有的n+1个点,可以再任一点结束,的最短路
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100100
using namespace std;
int n,k;
double newtag;
double xx[N];
double ans;
double y;
double get_dis(int l)
{
return sqrt((xx[l]-xx[n+1])*(xx[l]-xx[n+1])+y*y);
}
double dis[N];
double to[N];
double calc1(int l,int r)
{
return xx[r]-xx[l]+min(get_dis(l),get_dis(r));
}
double calc2(int l,int r)
{
return xx[r]-xx[l]+min(get_dis(l)+fabs(newtag-xx[r]),get_dis(r)+fabs(newtag-xx[l]));
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n+1;i++)
{
int x;
scanf("%lf",&xx[i]);
}
scanf("%lf",&y);
newtag=xx[k];
sort(xx+1,xx+n+1);
if(k==n+1)
{
double ans=calc1(1,n);
printf("%.10lf\n",ans);
}else
{
double ans=calc2(1,n);
for(int i=1;i<n;i++)
{
ans=min(ans,min(calc1(1,i)+calc2(i+1,n),calc2(1,i)+calc1(i+1,n)));
}
printf("%.10lf\n",ans);
}
}