4 条题解

  • 3
    @ 2024-11-11 20:37:25

    考虑二分答案(这好像跟楼上是两种思路)

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[100005],d;
    int c[100005];
    bool check(int k){//验证此答案是否可行
    	int cnt=1,tmp=0;
    	for(int i=2;i<=n;i++){
    		tmp+=c[i];
    		if(tmp>=k) cnt++,tmp=0; 
    	}
    	if(cnt>=m) return true;
    	else return false;
    }
    
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    	}
    	sort(a+1,a+n+1);
    	for(int i=2;i<=n;i++){
    		c[i]=a[i]-a[i-1];//差分
    		d=max(d,c[i]);//二分上界
    	}
    	int l=0,r=d*2;
    	int mid;
    	while(l+1<r){//二分答案
    		mid=(l+r)>>1;
    		if(check(mid)) l=mid;
    		else r=mid;
    	}
    	printf("%d",l);
    	return 0;
    } 
    
    

    信息

    ID
    1012
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    43
    已通过
    10
    上传者