zoukankan      html  css  js  c++  java
  • SOJ

    11512. Big Circle

    Constraints

    Time Limit: 2 secs, Memory Limit: 256 MB

    Description

    On the opening ceremony of World Cup there was a part where many kids from around the world was trying to make a big circle on the field which symbolized tolerance and multicultural friendship.

    They succeed in making a perfect circle, but as they didn't practice very much, kids weren't uniformly distributed on circle. You spotted that very quickly, and you want to know what is the minimum distance between some two kids.

    Input

    First line of the input contains number N (2<=N<=10^5) representing number of kids. Each of next N lines contains two real numbers rounded on two decimal places – coordinates of the each kid. All coordinates will be in interval [-10^6, 10^6]. It is guaranteed that all points will be on circle.

    Output

    First and only line of output should contain one real number (rounded on two decimal places) – Euclidian distance between two nearest kids. Euclidian distance between points (x1, y1) and (x2, y2) is sqrt((x1-x2)^2+(y1-y2)^2).

    Sample Input

    5
    1.00 4.00
    -0.50 -1.60
    4.00 1.00
    3.12 3.12
    -1.60 -0.50
    

    Sample Output

    1.56
    

    Hint

    In the sample, Kids at points (−0.50,−1.60) and (−1.60,−0.50) are nearest and distance between them is 1.56.

    Problem Source

    2014年每周一赛第七场/JBOI 2014

    题意:求圆上若干点形成的最短弦长度。

    思路:先任选三点确定圆心(两弦中垂线交点),再将整个圆平移,使圆心和坐标原点重合,这样就可以从x轴正半轴开始按逆时针将各个点排序,然后再求相邻两点所形成的弦的长度,取最小的就是所求答案。

     1 // Problem#: 11512
     2 // Submission#: 3027891
     3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
     4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
     5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
     6 #include<bits/stdc++.h>
     7 using namespace std;
     8 typedef long long ll;
     9 struct P{
    10     double x,y;
    11 };
    12 vector<P>v;
    13 int n;
    14 double X,Y;
    15 inline double d2(P a,P b)
    16 {
    17     return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    18 }
    19 int F(P p)
    20 {
    21     if(p.y == 0)return p.x > 0 ? 0 : 4;
    22     if(p.x == 0)return p.y > 0 ? 2 : 6;
    23     if(p.x > 0 && p.y > 0)return 1;
    24     if(p.x < 0 && p.y > 0)return 3;
    25     if(p.x < 0 && p.y < 0)return 5;
    26     if(p.x > 0 && p.y < 0)return 7;
    27 }
    28 bool cmp(const P& a,const P& b)
    29 {
    30     int fa = F(a),fb = F(b);
    31     if(fa != fb)return fa < fb;
    32     else return a.y * b.x < a.x * b.y;
    33 }
    34 int main()
    35 {
    36     int i;
    37     while(~scanf("%d",&n))
    38     {
    39         v.clear();
    40         for(i=0;i<n;i++)
    41         {
    42             P p;
    43             scanf("%lf%lf",&p.x,&p.y);
    44             v.push_back(p);
    45         }
    46         if(n==2)
    47         {
    48             printf("%.2f
    ",sqrt(d2(v[0],v[1])));
    49             continue;
    50         }
    51         double xm01=(v[0].x+v[1].x)/2.0,ym01=(v[0].y+v[1].y)/2.0;
    52         double xm12=(v[1].x+v[2].x)/2.0,ym12=(v[1].y+v[2].y)/2.0;
    53         double dym01m12 = ym12 - ym01;
    54         double dx01=v[1].x-v[0].x,dy01=v[1].y-v[0].y;
    55         double dx12=v[2].x-v[1].x,dy12=v[2].y-v[1].y;
    56         X = (dym01m12 * dy12 * dy01 - xm01 * dx01 * dy12 + xm12 * dx12 * dy01) / (dx12 * dy01 - dx01 * dy12);
    57         if(dy01)
    58         Y = ym01 - (X - xm01) * dx01 / dy01;
    59         else//dy12 != 0
    60         Y = ym12 - (X - xm12) * dx12 / dy12;
    61         for(i=0;i<n;i++)
    62         {
    63             v[i].x-=X;
    64             v[i].y-=Y;
    65         }
    66         sort(v.begin(),v.end(),cmp);
    67         double ans=d2(v[0],v[1]);
    68         double d;
    69         for(i=1;i<n;i++)ans = min(ans,d=d2(v[i-1],v[i]));
    70         ans = min(ans,d2(v[n-1],v[0]));
    71         printf("%.2f
    ",sqrt(ans));
    72     }
    73     return 0;
    74 }
    75 /*
    76 3
    77 0.71 0.71
    78 0.71 -0.71
    79 -1.00 0.00
    80 */                                 

    PS:原题数据貌似不够强,去掉第70行代码也能AC,实际上过不了上面那组数据。

  • 相关阅读:
    Java 函数式编程—@FunctionalInterface----functional interface
    人月神话的博客
    如何度量复杂度
    泛型沉思录:创建模版与使用模版生成代码
    ioc与bean管理
    模式(思维)匹配是什么
    简析散光的成因,以及什么是散光的度数和轴位?
    概括是什么?
    思维与模型、世界观
    抽象、维度、层次与分析、综合
  • 原文地址:https://www.cnblogs.com/gangduo-shangjinlieren/p/4041729.html
Copyright © 2011-2022 走看看