http://acm.hdu.edu.cn/showproblem.php?pid=1007

题意:平面上有n个点,问最近的两个点之间的距离的一半是多少。

思路:用分治做。把整体分为左右两个部分,那么有三种情况:最近的两个点都在左边,最近的两个点都在右边和最近的两个点一个在左边一个在右边。对于第一第二种情况,直接递归处理,分解成子问题就好了,主要是要处理第三种情况。最暴力的做法是O(n^2)的扫,这样肯定会TLE。那么要作一些优化。首先我们先递归处理得到第一种和第二种情况的答案的较小值,然后用这个答案去优化,即如果x上,某个点距离中点的距离在ans内的话,那么这个点是可能可以得到更优答案的,如果距离大于ans,那么肯定不能得到更优的答案。将这些点存起来,然后对y进行排序,暴力O(n^2)扫这些存起来的点,和第一个优化类似,如果当前两点之间y的距离大于等于ans,那么后面的答案肯定是大于ans的,直接break跳出去。

 #include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 100010
#define INF 0x3f3f3f3f
struct node {
double x, y;
} p[N], tmp[N]; double min(double a, double b) { return a < b ? a : b; } bool cmpx(const node &a, const node &b) { return a.x < b.x; } bool cmpy(const node &a, const node &b) { return a.y < b.y; } double cal(node a, node b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } double solve(int l, int r) {
if(r - l == ) return cal(p[r], p[l]);
if(r - l == ) return min(cal(p[l], p[r]), min(cal(p[r], p[r-]), cal(p[r-], p[l])));
int mid = (l + r) >> , cnt = ;
double ans = min(solve(l, mid), solve(mid + , r));
for(int i = l; i <= r; i++)
if(p[i].x - ans <= p[mid].x && p[i].x + ans >= p[mid].x)
tmp[++cnt] = p[i];
sort(tmp + , tmp + + cnt, cmpy);
for(int i = ; i <= cnt; i++)
for(int j = i + ; j <= cnt; j++)
if(tmp[j].y - tmp[i].y >= ans) break;
else ans = min(ans, cal(tmp[i], tmp[j]));
return ans;
} int main() {
int n;
while(scanf("%d", &n), n) {
for(int i = ; i <= n; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
sort(p + , p + + n, cmpx);
printf("%.2f\n", solve(, n) / 2.0);
}
return ;
}

HDU 1007:Quoit Design(分治求最近点对)的更多相关文章

  1. hdu 1007 Quoit Design 分治求最近点对

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  2. HDU 1007 Quoit Design(经典最近点对问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  3. HDU 1007 Quoit Design 平面内最近点对

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...

  4. HDU 1007 Quoit Design(计算几何の最近点对)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  5. hdu 1007 Quoit Design(平面最近点对)

    题意:求平面最近点对之间的距离 解:首先可以想到枚举的方法,枚举i,枚举j算点i和点j之间的距离,时间复杂度O(n2). 如果采用分治的思想,如果我们知道左半边点对答案d1,和右半边点的答案d2,如何 ...

  6. HDU 1007 Quoit Design【计算几何/分治/最近点对】

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. hdu 1007 Quoit Design(分治法求最近点对)

    大致题意:给N个点,求最近点对的距离 d :输出:r = d/2. // Time 2093 ms; Memory 1812 K #include<iostream> #include&l ...

  8. hdu 1007 Quoit Design (最近点对问题)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. HDU 1007 Quoit Design(二分+浮点数精度控制)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  10. (hdu1007)Quoit Design,求最近点对

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

随机推荐

  1. Spring框架:Spring安全

    在传统的Web发展,安全码被分散在各个模块,这样方便管理,有时你可能会错过一个地方导致安全漏洞.为了解决这个问题,它的发明Spring Security.它是业务逻辑的有关安全代码的作用全部转移到一个 ...

  2. ListView、TreeView和DataGrid。

    原文:ListView.TreeView和DataGrid. 1.ListView. ListView继承自简单的没有特色的ListBox,并使用View属性进行扩展.增加了对基于列显示的支持,并增加 ...

  3. 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim

    最近同事对  .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试,发现在 linux 上高并发下使用 async 异步方法读取缓存数据会 ...

  4. SICP 1.9-1.10

    1.9 2^102^162^16 2n2^(n)2的(n-1)层次方(每一层都是2次方) 比如 h(4) = 2^(2^(2^2)) = 2^16

  5. wpf怎么使用WindowsFormsHost(即winform控件)

    原文:wpf怎么使用WindowsFormsHost(即winform控件) 使用方法: 1.首先,我们需要向项目中的引用(reference)中添加两个动态库dll,一个是.NET库中的System ...

  6. 【全面解禁!真正的Expression Blend实战开发技巧】第二章 你好,UI设计师

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第二章 你好,UI设计师 你好,UI设计师 曾几何时我从没想过要与艺术家打交道,但是Silverlight改变了这一切.UI设计师 ...

  7. Objective

    1.NSSet 1.是一个无序的,管理多个对象的集合类,最大特点 是集合中不允许出现重复对象,和数学上的集合含义是一 样的 2.除了无序.不许重复之外,其它功能和NSArray是一样的 2.NSArr ...

  8. win10 uwp 萤火虫效果

    原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...

  9. LINQ学习笔记(一)

    LINQ,语言集成查询(Language Integrated Query)是一组用于C#和Visual Basic语言的扩展. 它允许编写C#或Visual Basic代码以查询数据库相同的方法操作 ...

  10. Flot Reference flot参考文档

    Consider a call to the plot function:下面是对绘图函数plot的调用: var plot = $.plot(placeholder, data, options) ...