博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva-10245-分治
阅读量:6577 次
发布时间:2019-06-24

本文共 3426 字,大约阅读时间需要 11 分钟。

题意:数组二维空间内的点,求最近的俩个点的距离.

根据x排序,求左部分的最近距离,右部分最近距离,然后以中点,当前距离为半径,计算所有的点距离.

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"math.h"#include "stdio.h"namespace cc{ using std::cout; using std::endl; using std::cin; using std::map; using std::vector; using std::string; using std::sort; using std::priority_queue; using std::greater; using std::vector; using std::swap; using std::stack; using std::bitset; class Node { public: double x; double y; Node() {}; Node(double x, double y) :x(x), y(y) {}; }; constexpr int N = 10000; Node a[N + 1]; bool cmp(Node& a, Node& b) { return a.x < b.x; } double dist(Node a, Node b) { return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y)); } double minDist(int l, int r) { if (l > r) return 40004; int mid = (l + r) / 2; int s = mid, e = mid; double d = std::min(minDist(l, mid - 1), minDist(mid + 1, r)); while (s >= l && d > a[mid].x - a[s].x) s--; while (e <= r && d > a[e].x- a[mid].x) e++; for (int i = s + 1;i < e;i++) { for (int j = i + 1;j < e;j++) { d = std::min(dist(a[i], a[j]), d); } } return d; } void solve() { double s, e; int n; while (cin >> n && n) { for (int i = 0;i < n;i++) { cin >> s >> e; Node node(s, e); a[i] = node; } sort(a, a + n, cmp); double d = minDist(0,n-1); if (d >= 10000) { cout << "INFINITY" << endl; } else { printf("%.4lf\n",d); } } }};int main(){#ifndef ONLINE_JUDGE freopen("d://1.text", "r", stdin);#endif // !ONLINE_JUDGE cc::solve(); return 0;}

另外,这个题裸奔也行的

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"math.h"#include "stdio.h"namespace cc{ using std::cout; using std::endl; using std::cin; using std::map; using std::vector; using std::string; using std::sort; using std::priority_queue; using std::greater; using std::vector; using std::swap; using std::stack; using std::bitset; class Node { public: double x; double y; Node() {}; Node(double x, double y) :x(x), y(y) {}; }; constexpr int N = 10000; Node a[N + 1]; bool cmp(Node& a, Node& b) { return a.x < b.x; } double dist(Node a, Node b) { return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y)); } double minDist(int l, int r) { if (l > r) return 40004; int mid = (l + r) / 2; int s = mid, e = mid; double d = std::min(minDist(l, mid - 1), minDist(mid + 1, r)); while (s >= l && d > a[mid].x - a[s].x) s--; while (e <= r && d > a[e].x- a[mid].x) e++; for (int i = s + 1;i < e;i++) { for (int j = i + 1;j < e;j++) { d = std::min(dist(a[i], a[j]), d); } } return d; } void solve() { double s, e; int n; while (cin >> n && n) { for (int i = 0;i < n;i++) { cin >> s >> e; Node node(s, e); a[i] = node; } sort(a, a + n, cmp); double d = 400000; for (int i = 0;i < n;i++) { for (int j = i + 1;j < n;j++) { d = std::min(dist(a[i],a[j]),d); } } if (d >= 10000) { cout << "INFINITY" << endl; } else { printf("%.4lf\n",d); } } }};int main(){#ifndef ONLINE_JUDGE freopen("d://1.text", "r", stdin);#endif // !ONLINE_JUDGE cc::solve(); return 0;}

 

posted on
2019-01-12 00:30 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/10258327.html

你可能感兴趣的文章
C# Excel嵌入到Winform
查看>>
修改HTML5 input placeholder 颜色及修改失效的解决办法
查看>>
Windows 服务器部署 asp.net core
查看>>
html5 随机数函数
查看>>
数据结构之图(2-1)【十字链表】适用于有向图
查看>>
你必须知道的简单的位操作技巧
查看>>
怎样合并排序数组(How to merge 2 sorted arrays?)
查看>>
年礼成快递企业不再接件主因:苹果产品最疯狂
查看>>
实习第三天
查看>>
Java第四次实验
查看>>
CSS3transition实现的简单动画菜单
查看>>
C语言基础回顾
查看>>
在Java中,以下关于方法重载和方法重写描述正确的是?
查看>>
Codeforces Round #315 (Div. 2A) 569A Music (模拟)
查看>>
提升代码内外部质量的22条经验(转载)
查看>>
利用Linq对集合元素合并、去重复处理
查看>>
AS3.0 Bitmap类实现图片3D旋转效果
查看>>
BZOJ1876:[SDOI2009]SuperGCD——C++高精度良心题解
查看>>
2018-2019 20165226 Exp5 MSF基础应用
查看>>
yum安装的JDK的没有配置环境变量但是在/usr/bin下面都做了软链接
查看>>