HD-ACM算法专攻系列(15)——Quoit Design
问题描述:
源码:
经典问题——最近邻问题,标准解法
#include"iostream"
#include"algorithm"
#include"cmath"
using namespace std; struct Point
{
double x;
double y;
}; Point S[100000];//不使用全局变量可能会超内存 bool cmpPointX(Point a, Point b)
{
return a.x > b.x;
} bool cmpPointY(Point a, Point b)
{
return a.y > b.y;
} double EfficientClosestPair(Point *P, Point *Q, int start, int n)
{
if(n <= 3)
{
double result;
result = (P[start].x - P[start+1].x)*(P[start].x - P[start+1].x) + (P[start].y - P[start+1].y) * (P[start].y - P[start+1].y);
if(n == 3)
{
double tmp = (P[start].x - P[start+2].x)*(P[start].x - P[start+2].x) + (P[start].y - P[start+2].y) * (P[start].y - P[start+2].y);
if(tmp < result)result = tmp;
tmp = (P[start+1].x - P[start+2].x)*(P[start+1].x - P[start+2].x) + (P[start+1].y - P[start+2].y) * (P[start+1].y - P[start+2].y);
if(tmp < result)result = tmp;
}
return result;
}
else
{
int half = n / 2;
double d1 = EfficientClosestPair(P, Q, start, half);
double d2 = EfficientClosestPair(P, Q, start + half, n - half);
double d = d1 < d2 ? d1 : d2;
double m = P[start + half - 1].x;
int count = 0;
double tmp;
for(int i = start; i < start + n; i++)
{
tmp = Q[i].x - m;
if(tmp < 0)tmp = - tmp;
if(tmp < d)count++;
}
double dminsq = d;
if(count > 1)
{
//Point *S = new Point[count];
for(int i = start, j = 0; i < start + n; i++)
{
tmp = Q[i].x - m;
if(tmp < 0)tmp = - tmp;
if(tmp < d)
{
S[j].x = Q[i].x;
S[j].y = Q[i].y;
j++;
}
}
int k;
for(int i = 0; i < count - 1; i++)
{
k = i + 1;
while(k < count && (S[k].y - S[i].y)*(S[k].y - S[i].y) < dminsq)
{
dminsq = min((S[k].x - S[i].x)*(S[k].x - S[i].x) + (S[k].y - S[i].y)*(S[k].y - S[i].y), dminsq);
k++;
}
}
} return dminsq; }
} int main()
{
int n;
Point *P, *Q;
cout.precision(2);
cout.setf(ios::fixed);
P = new Point[100000];
Q = new Point[100000];
while(scanf("%d", &n) != EOF)
{
if(n == 0)break;
for(int i = 0; i < n; i++)
{
scanf("%lf %lf", &P[i].x,&P[i].y);
Q[i].x = P[i].x;
Q[i].y = P[i].y;
}
if(n <= 3)
{
cout<<sqrt(EfficientClosestPair(P, Q, 0, n)) / 2<<endl;
}
else
{
sort(P, P+n, cmpPointX);//使用qsort可能会超时
sort(Q, Q+n, cmpPointY);
cout<<sqrt(EfficientClosestPair(P, Q, 0, n)) / 2<<endl;
}
}
return 0;
}
HD-ACM算法专攻系列(15)——Quoit Design的更多相关文章
- HD-ACM算法专攻系列(23)——Crixalis's Equipment
题目描述: AC源码:此次考察贪心算法,解题思路:贪心的原则是使留下的空间最大,优先选择Bi与Ai差值最大的,至于为什么?这里用只有2个设备为例,(A1,B1)与(A2,B2),假设先搬运A1,搬运的 ...
- HD-ACM算法专攻系列(21)——Wooden Sticks
题目描述: AC源码: 此题考查贪心算法,解题思路:首先使用快速排序,以w或l按升序排序(注意相等时,应按另一值升序排序),这样就将二维变量比较,变为了一维的,排好序的一边就不需要去管了,只需要对未排 ...
- HD-ACM算法专攻系列(22)——Max Sum
问题描述: AC源码: 此题考察动态规划,解题思路:遍历(但有技巧),在于当前i各之和为负数时,直接选择以第i+1个为开头,在于当前i各之和为正数时,第i个可以不用作为开头(因为前i+1个之和一定大于 ...
- HD-ACM算法专攻系列(20)——七夕节
问题描述: AC源码: /**/ #include"iostream" #include"cmath" using namespace std; int mai ...
- HD-ACM算法专攻系列(19)——Leftmost Digit
问题描述: AC源码: 解题关键是,数据很大,不能强算,需要使用技巧,这里使用科学计算法,令N^N=a*10^n ,取对数后变为 N*log10(N)=log10(a)+n,令x = log10(a) ...
- HD-ACM算法专攻系列(18)——Largest prime factor
题目描述: 源码: 需要注意,若使用cin,cout输入输出,会超时. #include"iostream" #include"memory.h" #defin ...
- HD-ACM算法专攻系列(17)——find your present (2)
题目描述: 源码: #include"iostream" #include"string" using namespace std; bool IsFirstH ...
- HD-ACM算法专攻系列(16)——考试排名
问题描述: 源码: 主要要注意输出格式. #include"iostream" #include"iomanip" #include"algorith ...
- HD-ACM算法专攻系列(14)——find your present (2)
问题描述: 源码: #include"iostream" #include"algorithm" using namespace std; bool cmp(i ...
随机推荐
- JavaScript的并且&&
<html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...
- [转]C++内存管理
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- shell学习第二弹-进阶
1.linux系统中配置文件执行顺序 1)用户登录系统,首页调用/etc/profile文件初始化所有bash用户的默认特征 2)然后shell依次查找~/.bash_profile,~/.bash_ ...
- Win8.1应用开发之适配器模式(C#实现)
实际上适配器模式是用于解耦.设想一下我们的程序模块A在与模块B打交道时,需要在许多地方多次使用B中某个类的方法,而负责开发B的程序猿Tom还未完全实现该类,会随时更改该类中的方法,那么当Tom在修改时 ...
- PhotoZoom Classic 7怎么样?对电脑和系统要求高不高?
PhotoZoom Classic 7怎么样?对电脑和系统要求高不高? 相较于更专业PhotoZoom Pro,标准版本的PhotoZoom Classic 7更适用于日常工作中的图片放大处理,例如在 ...
- Spring AOP 介绍与基于接口的实现
热烈推荐:超多IT资源,尽在798资源网 声明:转载文章,为防止丢失所以做此备份. 本文来自公众号:程序之心 原文地址:https://mp.weixin.qq.com/s/vo94gVyTss0LY ...
- TensorFlow实战学习笔记(14)------VGGNet
一.VGGNet:5段卷积[每段有2~3个卷积层+最大池化层][每段过滤器个数:64-128-256-512-512] 每段的2~3个卷积层串联在一起的作用: 2个3×3的卷积层串联的效果相当于一个5 ...
- C语言基础 (9) 数组指针
复习 只要把地址拿到就能这么操作.. (这里是合法的地址,不是野指针) 只有定义变量后,此变量的地址才是合法的地址 野指针就是保存没有意义地址的指针变量 操作野指针变量本身不会有任何问题 操作野指针所 ...
- redi通过哨兵sentinel实现主从切换
本次实验主要为了让哨兵监听redis主从复制,当主节点关闭后,哨兵会选举一台从节点成为主节点,并且让其他从节点变成新主节点得从节点 本次理论需要三台机器,一主两从,为了方便用一台服务器开启三个实例,一 ...
- Ajax jQuery下拉框联动案例
需求: 使用ajax和jQuery实现下拉框联动. 注意:需要加入jquery-2.1.1.min.js 前台 <!DOCTYPE html> <html> <head& ...