3 条题解

  • 3
    @ 2022-12-13 10:48:17
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+1;
    int n,c;
    int a[maxn];
    bool check(int d)
    {
        int cow=1;
        int now=a[1]+d;
        for(int i=2;i<=n;i++)
        {
            if(a[i]<now) continue;
            cow++;
            now=a[i]+d;
        }
        return cow>=c;
    }
    int main()
    {
        cin>>n>>c;
        for(int i=1;i<=n;i++)
           cin>>a[i];     
        sort(a+1,a+n+1);
        int l=0,r=a[n]-a[1];
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if(check(mid))
                l=mid+1;
            else
                r=mid-1; 
        }
        cout<<r;
        return 0;
    }
    
    • 1
      @ 2024-5-12 10:36:21

      一个妥妥的二分答案嗷

      #include <bits/stdc++.h>
      using namespace std;
      /*校验距离为mid,能安放牛的数量 w 
      w<c mid偏大 r=mid-1 
      w>c 偏小 l=mid+1
      w=c 找右边界 l=mid+1 
      */ 
      const int N=1e9;
      int n,c;
      int a[100010];
      int check(int mid){
      	int w=1;//校验距离为mid,能安放牛的数量 w 
      	int start=1;
      	for(int i=2;i<=n;i++){
      		if(a[i]-a[start]>=mid){
      			w++;
      			start=i;//上一个放牛的牛棚坐标 
      		}
      	}
      	return w;
      }
      int main() {
        	scanf("%d%d",&n,&c);
        	for(int i=1;i<=n;i++){
        		scanf("%d",&a[i]);
      	}
      	sort(a+1,a+n+1);
      	int l=1,r=N,mid;
      	while(l<=r){
      		mid=l+r>>1;
      		if(check(mid)>=c){
      			l=mid+1;
      		}else{
      			r=mid-1;
      		}
      	}
      	printf("%d",r);
        	return 0;
      }
      
      • 1
        @ 2023-3-26 11:50:38
        #include <bits/stdc++.h>
        using namespace std;
        int a[1000010],n,c;
        bool check(int d){
        	int cnt=0,last=-1e9;
        	for(int i=1;i<=n;i++)
        	{
        		if(a[i]-last>=d)
        		{
        			last=a[i];
        			cnt++;
        		}
        	}
        	return cnt>=c;
        }
        int find(){
        	int l=0,r=1e9,ret=0;
        	while(l<=r)
        	{
        		int mid=(l+r)/2;
        		if(check(mid))
        		{
        			ret=mid;
        			l=mid+1;
        		}
        		else
        		{
        			r=mid-1;
        		}
        	}
        	return ret;
        }
        int main()
        {
            cin>>n>>c;
        	for(int i=1;i<=n;i++)
        	{
        		cin>>a[i];
        	}
        	sort(a+1,a+n+1);
        	cout<<find();
            return 0;
        }
        
        • 1

        信息

        ID
        906
        时间
        1000ms
        内存
        128MiB
        难度
        3
        标签
        递交数
        73
        已通过
        40
        上传者