Quoit Design(hdu 1007)

题意:给n个点的坐标,求距离最近的一对点之间距离的一半。第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标。实数。

/*
  最小点距离问题
  采用分治算法,假设对于1-n的区间,我们已经求出1~m(m是中点)和m+1~n的结果分别是d1和d2。
  那么如果1~n的答案出现在这两个单独的区间内,很明显就是min(d1,d2),否则在两个区间之间产生。
  如果直接两重循环枚举两个区间的数会T,所以考虑优化:
  ①:如果某个点到m的距离大于min(d1,d2),那么不考虑。
  ②:首先用到一个结论:
        假设有一个点q,坐标是xq, yq。可以证明在以q为底边中点,长为2d,宽为d的矩形区域内不会有超过6个点
        (证明见算法导论,然而我并没看懂,Orz)
      有了这个结论之后,我们将第一次优化后的点按照y排序,对于一个点i,如果某个点j与i的y坐标之差大于之前求出的ans,那么j之后的就不用计算了。   (不是很明白复杂度的证明)
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 1000010
using namespace std;
int n;
struct node{
    double x,y;
};node qx[N],qy[N];
bool cmpx(const node&s1,const node&s2){
    return s1.x<s2.x;
}
bool cmpy(const node&s1,const node&s2){
    return s1.y<s2.y;
}
double getdis(node i,node j){
    return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));
}
double solve(int s,int e){
    if(s+1==e) return getdis(qx[s],qx[e]);
    if(s+2==e) return min(min(getdis(qx[s],qx[s+1]),getdis(qx[s+1],qx[e])),getdis(qx[s],qx[e]));
    int mid=s+e>>1,cnt=0;
    double ans=min(solve(s,mid),solve(mid+1,e));
    for(int i=s;i<=e;i++)
        if(fabs(qx[i].x-qx[mid].x)<=ans)
            qy[++cnt]=qx[i];
    sort(qy+1,qy+cnt+1,cmpy);
    for(int i=1;i<=cnt;i++){
        for(int j=i+1;j<=cnt;j++){
            if(qy[j].y-qy[i].y>=ans) break;
            ans=min(ans,getdis(qy[i],qy[j]));
        }
    }
    return ans;
}
void work(){
    for(int i=1;i<=n;i++)
        scanf("%lf%lf",&qx[i].x,&qx[i].y);
    sort(qx+1,qx+n+1,cmpx);
    printf("%.2lf\n",solve(1,n)/2);
}
int main(){
     while(1){
         scanf("%d",&n);
         if(!n) break;
         work();
     }
     return 0;
}
时间: 2024-10-13 01:08:09

Quoit Design(hdu 1007)的相关文章

HDU 1007 Quoit Design (分治)

Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some toys, with all the toys encircled awarded. In the field of Cyberground, the position of each toy is fixed, and the ri

HDU 4804 Campus Design(插头DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法 思路:插头DP的变形,只要多考虑1X1的情况即可,然后DP多开一维表示使用1X1的个数 代码: #include <stdio.h> #include <string.h> #include <algorithm> #include

Valentine&#39;s Day Round 1001.Ferries Wheel(hdu 5174)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1]<A[i]<A[i+1](1<i<K).现在要求的是,有多少人满足,(他坐的缆车的值 + 他左边缆车的值) % INT_MAX == 他右边缆车的值. 首先好感谢出题者的样例三,否则真的会坑下不少人.即同一部缆车可以坐多个人.由于缆车的值是唯一的,所以可以通过排序先排出缆车的位置.求出

最短路 (HDU 2544)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28836    Accepted Submission(s): 12480 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

BestCoder Round #70 Jam&#39;s math problem(hdu 5615)

Problem Description Jam has a math problem. He just learned factorization. He is trying to factorize ax^2+bx+cax?2??+bx+c into the form of pqx^2+(qk+mp)x+km=(px+k)(qx+m)pqx?2??+(qk+mp)x+km=(px+k)(qx+m). He could only solve the problem in which p,q,m,

RPG的错排 (HDU 2068)

RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6746    Accepted Submission(s): 2738 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

字典树 Trie (HDU 1671)

Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers: 1. Emergency 911 2. Alice 97 625 999 3. Bob 91 12 54 26 In this

15个优秀的 Material Design(材料设计)案例

Material Design (材料设计)是由谷歌创建和设计的一种设计语言,结合成功的设计的经典原则以及创新科技.谷歌的目标是开发一个设计系统,让所有的产品在任何平台上拥有统一的用户体验.全新的设计理念,采用大胆的色彩.流畅的动画播放,以及卡片式的简洁设计. 您可能感兴趣的相关文章 Material UI – Material Design CSS 框架 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的10个效果[