知识点:二分
这个就是二分判定最简单的应用题,对于满足单调性的题目,我们可以利用二分将求最优解转化为判定问题,同时我们要注意,满足题意的解是在哪半边。
- #include
-
- using namespace std;
-
- const int N = 1e5 + 5;
-
- int n, m, a[N];
-
- bool check(int x) {
- int cnt = 1;
- int last = a[0];
- for (int i = 1; i < n; i++) {
- if (a[i] - last >= x) {
- cnt++;
- last = a[i];
- }
- }
- return cnt >= m;
- }
-
- int main() {
- int T;
- cin >> T;
- while (T--) {
- cin >> n >> m;
- for (int i = 0; i < n; i++) cin >> a[i];
- sort(a, a + n);
- int l = -1, r = 1e9 + 7;
- while (l < r) {
- int mid = (l + r + 1) >> 1;
- if (check(mid)) l = mid;
- else r = mid - 1;
- }
- cout << l << endl;
- }
- return 0;
- }