zoukankan      html  css  js  c++  java
  • 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
    光伴随的阴影
  • 相关阅读:
    Android Virtual Device(AVD)屏幕大小调整
    修改obj三维模型文件中坐标z为其相反数
    AE安装检测(C++)
    单件模式
    地形转立体实验截图
    保持几何特征的三维建筑物模型简化方法 毕业硕士论文
    判断多边形点串存放序列
    mathematica 查找 mathpass 注册文件位置
    在线调色板搜集
    图标资源搜集
  • 原文地址:https://www.cnblogs.com/forward777/p/10361778.html
Copyright © 2011-2022 走看看