1 条题解
-
0
📝 题目大意
给定平面上 个点,对于每个点 ,找出欧几里得距离最远的另一个点 。若存在多个等距最远点,则输出编号最小的那个。
💡 解题思路
-
题目分析:数据范围极小,,坐标绝对值 ,直接 暴力枚举即可。由于只需比较距离大小,比较平方距离即可避免浮点误差。
-
算法推导:对于每个点 ,遍历所有点 ,计算平方距离 。维护当前最大平方距离
maxDist2和对应的最远点索引farthest。当 时更新,使用严格大于号>而非>=,这样当多个点距离相等时,只会保留最先遇到(即编号最小)的那个点,自然完成题目要求的"编号最小"的平局处理。 -
边界与细节:
- 坐标差最大为 ,平方后为 ,两个坐标平方和最大约 ,在
int范围内,但std.cpp统一使用long long是更稳妥的做法。 - 输出时索引从 转为 (即
farthest + 1)。 - 不能将自己()作为答案,循环中需跳过。
- 坐标差最大为 ,平方后为 ,两个坐标平方和最大约 ,在
⏱️ 复杂度分析
- 时间复杂度:对每个点 遍历其余 个点,共 次比较,即 。 时仅需约 次运算,完全可行。
- 空间复杂度:仅需存储 个点的坐标,。
💻 标准代码 (C++)
#include <iostream> #include <vector> #include <cmath> using namespace std; int main() { int N; cin >> N; vector<int> X(N), Y(N); // 存储所有点的坐标 for (int i = 0; i < N; i++) { cin >> X[i] >> Y[i]; } for (int i = 0; i < N; i++) { int farthest = -1; // 当前最远点的索引(0-based) long long maxDist2 = -1; // 当前最大平方距离 for (int j = 0; j < N; j++) { if (i == j) continue; // 跳过自身 long long dx = X[i] - X[j]; // 横坐标差 long long dy = Y[i] - Y[j]; // 纵坐标差 long long dist2 = dx * dx + dy * dy; // 平方距离,避免浮点误差 // 严格大于:等距时保留先遇到的(编号更小)的点 if (dist2 > maxDist2) { maxDist2 = dist2; farthest = j; } } cout << farthest + 1 << endl; // 转为 1-based 编号输出 } return 0; } -
- 1
信息
- ID
- 785
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者