您的位置:首页 > 其它

HDU 1007 Quoit Design 分治

2016-08-10 10:17 267 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1007

题意:给出平面上n个点,问最近的两点之间的距离是多少(结果除以2)

思路:主要看的这篇博客:http://blog.csdn.net/hellobabygogo3/article/details/8042650,讲的很清楚了

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

const int N = 100010;
const int INF = 0x3f3f3f3f;
struct node
{
double x, y;
}arr
;
int brr
;
int n;
double dis(node a, node b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double closest(int l, int r)
{
if(r == l) return INF;
int mid = (l + r) >> 1;
double d = min(closest(l, mid), closest(mid + 1, r));
int k = 0;
for(int i = l; i <= r; i++)
if(arr[i].x >= arr[mid].x - d && arr[i].x <= arr[mid].x + d)
brr[k++] = i;
sort(brr, brr + k, [](int a, int b){return arr[a].y < arr[b].y;});
for(int i = 0; i < k; i++)
for(int j = i + 1; j < k; j++)
if(arr[brr[j]].y - arr[brr[i]].y >= d) break;
else d = min(d, dis(arr[brr[i]], arr[brr[j]]));
return d;
}
int main()
{
while(scanf("%d", &n), n)
{
for(int i = 0; i < n; i++)
scanf("%lf%lf", &arr[i].x, &arr[i].y);
sort(arr, arr + n, [](node a, node b){return a.x < b.x;});
printf("%.2f\n", closest(0, n - 1) / 2);
}
return 0;
}

挑战程序设计上的代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

const int N = 100010;
const int INF = 0x3f3f3f3f;
struct node
{
double x, y;
}arr
, brr
;
int n;

double closest(node arr[], int n)
{
if(n <= 1) return INF;
int m = n / 2;
double x = arr[m].x;
double d = min(closest(arr, m), closest(arr + m, n - m));
inplace_merge(arr, arr + m, arr + n, [](node a, node b){return a.y < b.y;});
int k = 0;
for(int i = 0; i < n; i++)
{
if(fabs(arr[i].x - x) >= d) continue;
for(int j = 0; j < k; j++)
{
double dx = arr[i].x - brr[k-j-1].x;
double dy = arr[i].y - brr[k-j-1].y;
if(dy >= d) break;
d = min(d, sqrt(dx * dx + dy * dy));
}
brr[k++] = arr[i];
}
return d;
}
int main()
{
while(scanf("%d", &n), n)
{
for(int i = 0; i < n; i++)
scanf("%lf%lf", &arr[i].x, &arr[i].y);
sort(arr, arr + n, [](node a, node b){return a.x < b.x;});
printf("%.2f\n", closest(arr, n) / 2.0);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: