HDU 1007 Quoit Design
题目大意:
求一堆点里最小的两点间距,然后再除以。
题解:
由于数据比较水,对横坐标排序后求相邻几个点的距离就过了。
正确做法参考了网上的题解:参考题解,将代码改成了自己的码风。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
#define io_speed_up ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MAXN 100005
struct Point {
double x, y;
} px[MAXN], py[MAXN];
double getDis(Point p1, Point p2) {
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
bool cmpx(Point p1, Point p2) {
return p1.x < p2.x;
}
bool cmpy(Point p1, Point p2) {
return p1.y < p2.y;
}
double closest(int s, int e) {
if (s + 1 == e) {
return getDis(px[s], px[e]);
}
if (s + 2 == e) {
return min(getDis(px[s], px[s + 1]), min(getDis(px[s + 1], px[e]), getDis(px[s], px[e])));
}
int mid = s + e >> 1;
double ans = min(closest(s, mid), closest(mid + 1, e)); // 分治
int cnt = 0;
for (int i = s; i <= e; ++i) { // 把x坐标在px[mid].x-ans~px[mid].x+ans范围内的点取出来
if (px[i].x >= px[mid].x - ans && px[i].x <= px[mid].x + ans) {
py[cnt++] = px[i];
}
}
sort(py, py + cnt, cmpy); // 按y坐标排序
for (int i = 0; i < cnt; ++i) {
for (int j = i + 1; j < cnt; ++j) { // py数组中的点是按照y坐标升序的
if (py[j].y - py[i].y >= ans) {
break;
}
ans = min(ans, getDis(py[i], py[j]));
}
}
return ans;
}
int n;
int main() {
io_speed_up; // 或者改成scanf
while (cin >> n && n) {
for (int i = 0; i < n; ++i) {
cin >> px[i].x >> px[i].y;
}
sort(px, px + n, cmpx);
double dis = closest(0, n - 1) / 2;
cout << fixed << setprecision(2);
cout << dis << endl;
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用