Codeforces 30D

来源:互联网 发布:网络电视直播翡翠台 编辑:程序博客网 时间:2024/05/16 10:58

题意从第k个点出发遍历所有的n+1个点,可以再任一点结束,的最短路

#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 100100using 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);    }}
0 0
原创粉丝点击