• math


       评测传送门

    Description:

    在二维平面内有一些点,求任意三个点使他们的两两距离之和最小。

    Input:

    第一行一个正整数n

    接下来n行每行两个整数xi,yi,表示第i个点的坐标

    Output:
    一行一个数表示最小距离和,保留6位小数。

    思路:

    求最近点对一样啊

    只是多枚举一个点计算两两距离之和而已

    但是还是有很多容易错的地方啊

    CODE:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #define R register
     6 #define go(i,a,b) for(R int i=a;i<=b;i++)
     7 #define ll long long
     8 #define db long double
     9 #define M 200000+1
    10 #define inf 2e50 // inf不能太小了
    11 using namespace std;
    12 int read()
    13 {
    14     int x=0,y=1;;char c=getchar();
    15     while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
    16     while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}  
    17     return x*y;
    18 }
    19 int n;
    20 struct node{int x,y;}a[M],b[M];
    21 bool cmp1(node x,node y){return x.x==y.x?x.y<y.y:x.x<y.x;}
    22 db cl(node x,node y){return (db)sqrt((ll)(x.x-y.x)*(x.x-y.x)+(ll)(x.y-y.y)*(x.y-y.y));}//注意这里的(ll)
    23 db sol(int l,int r)
    24 {
    25     if(l+1>=r) {if(a[l].y>a[r].y) swap(a[l],a[r]);return inf;}
    26      //注意上面 因为用的是归并排序,必须要保持序列按y递增
    27     int mid=(l+r)>>1,midx=a[mid].x;
    28     db ans=min(sol(l,mid),sol(mid+1,r));
    29     //---------------
    30     int l1=l,r1=mid+1,ct=0;
    31     while(l1<=mid&&r1<=r)
    32     {
    33         if(a[l1].y<=a[r1].y) b[++ct]=a[l1],l1++;
    34         else b[++ct]=a[r1],r1++;
    35     }
    36     while(l1<=mid) b[++ct]=a[l1],l1++;
    37     while(r1<=r) b[++ct]=a[r1],r1++;
    38     ct=0;
    39     go(i,l,r) a[i]=b[++ct];
    40     //---------------归并排序
    41     ct=0;
    42     go(i,l,r) if(abs((db)a[i].x-midx)<ans) b[++ct]=a[i];
    43     go(x,1,ct)
    44         go(y,x+1,ct)
    45     {
    46         if(b[y].y-b[x].y>=ans) break;
    47         go(z,y+1,ct)
    48         {
    49             if(b[z].y-b[y].y>=ans) break;
    50             ans=min(ans,cl(b[x],b[y])+cl(b[x],b[z])+cl(b[y],b[z]));
    51         }
    52     }
    53     return ans;
    54 }
    55 int main()
    56 {
    57     freopen("math.in","r",stdin);
    58     freopen("math.out","w",stdout);
    59     n=read();
    60     go(i,1,n) a[i].x=read(),a[i].y=read();
    61     sort(a+1,a+n+1,cmp1);
    62     printf("%.6Lf",sol(1,n));
    63     return 0;
    64 }
    View Code
    光伴随的阴影
  • 相关阅读:
    navicat 连接Oracle 报错 ORA-12514 TNS:listener does not currently know of service requested in connect descriptor
    centos 安装配置 redis
    ubuntu安装keras
    VB类似的InputBox为MFC
    WPF颜色选择器
    窗口样式
    IP地址、端口号、子网掩码提交表单库
    添加自定义对话框,您的应用程序
    在c#中使用异步等待构建响应式UI
    一个通用对话框
  • 原文地址:https://www.cnblogs.com/forward777/p/10361778.html
Copyright © 2020-2023  润新知