主题:

Quoit Design

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 136 Accepted Submission(s): 77
 
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 ring is carefully designed so it can only encircle one toy at a time. On the other hand, to make the game look more attractive, the ring is designed to have the largest radius. Given a configuration of the field, you are supposed to find the radius of such a ring.

Assume that all the toys are points on a plane. A point is encircled by the ring if the distance between the point and the center of the ring is strictly less than the radius of the ring. If two toys are placed at the same point, the radius of the ring is considered to be 0.

 
Input
The input consists of several test cases. For each case, the first line contains an integer N (2 <= N <= 100,000), the total number of toys in the field. Then N lines follow, each contains a pair of (x, y) which are the coordinates of a toy. The input is terminated by N = 0.
 
Output
For each test case, print in one line the radius of the ring required by the Cyberground manager, accurate up to 2 decimal places. 
 
Sample Input
2
0 0
1 1
2
1 1
1 1
3
-1.5 0
0 0
0 1.5
0
 
Sample Output
0.71
0.00
0.75
 
Author
CHEN, Yue
 
Source
ZJCPC2004
 
Recommend
JGShining

题目分析:

最小点对问题。所谓的最小点对问题就是,在n个点中找到2个点间的最短距离。这样的题有两种思路:

1)直接暴力。看一看数据规模,n都在100000左右了,O(n^2)的算法,不出意外,会TLE。

2)分治。

这道题用的是吉林大学的模板。直接套进去即可了。

与最小点对问题相应的是最大点对问题(不知道有没有这个名词,假设没有就当是我瞎编的吧。

所谓的最大点对问题,在我的定义里就是,在n个点中找到两个点之间的最大距离)。

可以产生最大距离的这两个点一定在凸包上。这时候我们仅仅要枚举凸包上的随意两个点即可。事实上这时候除了盲目枚举外,另一种更好的算法来解决问题——旋转卡壳算法。

代码例如以下:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring> using namespace std; /**
* 求n个点中,2个点之间的最短距离。
* 1)直接暴力。 肯定会TLE
* 2)使用吉林大学的模板
*/
const int N = 100005;
const double MAX = 10e100, eps = 0.00001;
struct Point {
double x, y;
int index;
};
Point a[N], b[N], c[N];
double closest(Point *, Point *, Point *, int, int);
double dis(Point, Point);
int cmp_x(const void *, const void*);
int cmp_y(const void *, const void*);
int merge(Point *, Point *, int, int, int);
inline double min(double, double); int main(){
int n;
while(scanf("%d",&n)!=EOF,n){
int i;
for(i = 0 ; i < n ; ++i){
scanf("%lf %lf",&a[i].x,&a[i].y);
}
qsort(a,n,sizeof(a[0]),cmp_x);
for(i = 0 ; i < n ; ++i){
a[i].index = i;
} /**
* memcpy(目标地址,起始地址,n个字节)
* 作用:从起始地址拷贝n个字节到目标地址
* 头文件: 尽量把 <cstring>引入
*
*/
memcpy(b,a,n*sizeof(a[0])); qsort(b,n,sizeof(b[0]),cmp_y); double ans = closest(a,b,c,0,n-1); printf("%.2lf\n",ans/2);
} return 0;
} double closest(Point a[], Point b[], Point c[], int p, int q) {
if (q - p == 1){
return dis(a[p], a[q]);
}
if (q - p == 2) {
double x1 = dis(a[p], a[q]);
double x2 = dis(a[p + 1], a[q]);
double x3 = dis(a[p], a[p + 1]);
if (x1 < x2 && x1 < x3){
return x1;
}
else if (x2 < x3){
return x2;
}
else{
return x3;
}
}
int i, j, k, m = (p + q) / 2;
double d1, d2;
for (i = p, j = p, k = m + 1; i <= q; i++){
if (b[i].index <= m){
c[j++] = b[i];
}
// 数组c 左半部保存划分后左部的点, 且对y 是有序的.
else{
c[k++] = b[i];
}
}
d1 = closest(a, c, b, p, m);
d2 = closest(a, c, b, m + 1, q);
double dm = min(d1, d2);
// 数组c 左右部分各自是对y 坐标有序的, 将其合并到b.
merge(b, c, p, m, q);
for (i = p, k = p; i <= q; i++){
if (fabs(b[i].x - b[m].x) < dm){
c[k++] = b[i];
}
}
// 找出离划分基准左右不超过dm 的部分, 且仍然对y 坐标有序.
for (i = p; i < k; i++){
for (j = i + 1; j < k && c[j].y - c[i].y < dm; j++) {
double temp = dis(c[i], c[j]);
if (temp < dm){
dm = temp;
}
}
}
return dm;
}
double dis(Point p, Point q) {
double x1 = p.x - q.x, y1 = p.y - q.y;
return sqrt(x1 * x1 + y1 * y1);
}
int merge(Point p[], Point q[], int s, int m, int t) {
int i, j, k;
for (i = s, j = m + 1, k = s; i <= m && j <= t;) {
if (q[i].y > q[j].y){
p[k++] = q[j], j++;
}else{
p[k++] = q[i], i++;
}
}
while (i <= m){
p[k++] = q[i++];
}
while (j <= t){
p[k++] = q[j++];
} memcpy(q + s, p + s, (t - s + 1) * sizeof(p[0]));
return 0;
}
int cmp_x(const void *p, const void *q) {
double temp = ((Point*) p)->x - ((Point*) q)->x;
if (temp > 0){
return 1;
}
else if (fabs(temp) < eps){
return 0;
}
else{
return -1;
}
}
int cmp_y(const void *p, const void *q) {
double temp = ((Point*) p)->y - ((Point*) q)->y;
if (temp > 0){
return 1;
}
else if (fabs(temp) < eps){
return 0;
}
else{
return -1;
}
}
inline double min(double p, double q) {
return (p > q) ? (q) : (p);
}

(hdu 7.1.8)Quoit Design(最低点——在n一个点,发现两点之间的最小距离)的更多相关文章

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

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

  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 (最近点对问题)

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

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

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

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

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

  6. HDU 1007:Quoit Design(分治求最近点对)

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:平面上有n个点,问最近的两个点之间的距离的一半是多少. 思路:用分治做.把整体分为左右两个部分,那么 ...

  7. ACM-计算几何之Quoit Design——hdu1007 zoj2107

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

  8. Quoit Design(最近点对+分治)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  9. HDU1007 Quoit Design 【分治】

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

随机推荐

  1. Redis Destop Manager不能访问虚拟机

    虚拟机centOS中安装Redis,主机Redis Destop Manager不能访问虚拟机Redis server的解决方案 今天在学些redis的时候碰到个问题,发现主机Redis Destop ...

  2. Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good

    引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相 ...

  3. 如何去掉List中的重复内容

    1.通过循环进行删除 public static void removeDuplicate(List list) { ; i < list.size() - ; i ++ ) { ; j > ...

  4. 14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate

    14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate 主的master thread ...

  5. 奔小康赚大钱 hdu 2255

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  6. uva-211-The Domino Effect

    http://uva.onlinejudge.org/external/2/211.html http://uva.onlinejudge.org/external/2/211.pdf 题意:每一种骨 ...

  7. JMS的样例

    1.JMS是一个由AS提供的Message服务.它能接受消息产生者(Message Provider)所发出的消息,并把消息转发给消息消费者(Message  Consumer).2.JMS提供2种类 ...

  8. hadoop深入研究:(七)——压缩

    转载请标明出处:hadoop深入研究:(七)——压缩 文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速.在hadoop大数据的背景下,这两点尤为重要,那么我现在就先来了解下 ...

  9. 外语学习强烈推荐Rosetta Stone

    外语学习强烈推荐Rosetta Stone 外语学习强烈推荐Rosetta Stone

  10. Java 泛型具体解释

    在Java SE1.5中.添加了一个新的特性:泛型(日本语中的总称型).何谓泛型呢?通俗的说.就是泛泛的指定对象所操作的类型.而不像常规方式一样使用某种固定的类型去指定. 泛型的本质就是将所操作的数据 ...