1 solutions

  • 0
    @ 2025-5-16 14:48:09

    题意:给定 nn 个坐标 x1,x2,,xnx_1, x_2, \dots, x_n 请从中挑出kk个坐标(k为给定值),使得选出的坐标两两之间的最短距离最大。

    题解:非常经典的二分答案最大化最小值的题型,先对坐标从小到大排序,然后二分枚举最短距离midmid,求当前情况下能够满足相邻坐标大于等于midmid的有多少个,如果不够kk个,那么我们需要把这个距离变小一点(即把搜寻区间调整到 [l,mid1][l,mid−1];反之,够的话把距离变大(搜寻区间调整到[mid+1,r][mid+1,r],同时把

    ansans更新一下。

    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