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 <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;
}
题意:给出平面上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;
}
相关文章推荐
- HDU 1007 Quoit Design | 平面分治
- HDU 1007 Quoit Design竟然要分治
- hdu 1007 zoj 2107 Quoit Design 求平面最近点对 分治法
- hdu-1007-Quoit Design-求最小点距离、分治思想
- HDU 1007 Quoit Design(分治)
- HDU 1007 Quoit Design (分治)
- HDU 1007 Quoit Design竟然要分治
- HDU - 1007 - Quoit Design (分治解平面最近点对)
- HDU 1007 Quoit Design (分治)
- 【HDU 1007 】Quoit Design 【分治--最近点对问题】
- HDU 1007 Quoit Design(最近点对问题:分治)
- HDU 1007 Quoit Design(分治)
- hdu 1007 Quoit Design(平面分治)
- hdu 1007 Quoit Design 最近点对(分治)
- HDU 1007 Quoit Design(分治)
- HDU 1007 Quoit Design (分治)
- hdu 1007 Quoit Design [sort+分治] 寻找最小距离点对
- hdu 1007 Quoit Design (最近点对、分治)
- hdu 1007 Quoit Design 分治求最近点对
- HDU 1007-Quoit Design (平面最近点对->分治)