1 solutions
-
0
题意:给定 个坐标 请从中挑出个坐标(k为给定值),使得选出的坐标两两之间的最短距离最大。
题解:非常经典的二分答案最大化最小值的题型,先对坐标从小到大排序,然后二分枚举最短距离,求当前情况下能够满足相邻坐标大于等于的有多少个,如果不够个,那么我们需要把这个距离变小一点(即把搜寻区间调整到 ;反之,够的话把距离变大(搜寻区间调整到,同时把
更新一下。
tips:二分搜索的前提是序列是有序的,二分答案的前提是 满足条件的答案是单调有序的(具有单调性)
#include <bits/stdc++.h> using namespace std; int x[300005]; int main() { int n, k; cin >> n >> k; for (int i = 1; i <= n; i++) cin >> x[i]; sort(x + 1, x + 1 + n); int l = 1, r = 2e9 + 1, ans = 0; while (l <= r) { int mid = (l + r) / 2; int pre = x[1], cnt = 1; for (int i = 2; i <= n; i++) { if (x[i] - pre >= mid) { cnt++; pre = x[i]; } } if (cnt >= k) { l = mid + 1; ans = mid; } else { r = mid - 1; } } cout << ans << endl; return 0; }
Information
- ID
- 664
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- (None)
- # Submissions
- 55
- Accepted
- 5
- Uploaded By