1 条题解

  • 0
    @ 2025-3-23 15:28:26
    • 二分常用于具有单调性的问题、或者最大值最小的问题。
    • 通常情况下:最大值最小这类问题,需要二分第一个最,check第二个最。
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e6+5, INF = 0x3f3f3f3f, MOD = 1E9 + 7;
    int n,c,a[N];
    // 最近距离 x 是否合法 
    bool check(int x){
    	int s=1;
    	for(int i=2, p=1; i<=n; i++) {
    		if(a[i] - a[p] >= x){
    			p = i, s ++;
    		}
    	}
    	return s >= c; 
    }
    void solve(){
    	cin>>n>>c;
    	for(int i=1; i<=n; i++) cin>>a[i];
    	sort(a+1, a+1+n);
    	int l=1, r=1e9, ans=l;
    	while(l <= r){  // 二分最大值 
    		int mid = l+r >> 1;
    		if(check(mid)) l=mid+1, ans=mid;
    		else r=mid-1;
    	}	
    	cout<<ans<<endl;
    }
    int main() {
    //	freopen("in.txt", "r", stdin);
       int t=1; // cin>>t;
       while(t--){ solve(); }
        return 0; 
    }
    
    • 1

    信息

    ID
    318
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    15
    已通过
    12
    上传者