4 条题解

  • 1
    @ 2025-10-23 18:40:12

    传送门

    思路

    二分答案。最小值最大,我们想到的肯定是最大化查找(即 ll 在可行区)。然后二分查找每一个 xix_i,判断是否符合所有牛都可以住下。复杂度 O(nlogn)\mathcal O\left(n\log n\right)

    AC code

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int x[int(1e5+5)],n,m;
    bool check(int xxx){
    	int cnt=1,id=1;
    	for(int i=2;i<=n;i++){
    		if(x[i]-x[id]>=xxx)cnt++,id=i;
    	}
    	return cnt>=m;
    }
    int upper(){
    	int l=0,r=x[n]-x[1]+1;
    	while(l+1<r){
    		int mid=l+r>>1;
    		if(check(mid))l=mid;
    		else r=mid;
    	}
    	return l;
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr),cout.tie(nullptr);
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		cin>>x[i];
    	}
    	sort(x+1,x+n+1);
    	cout<<upper();
    	return 0;
    }
    
    • 1
      @ 2024-11-19 20:28:35

      本题二分答案

      二分查找每一个可能的disdis

      判断是否符合所有牛都可以住下
      不符合就让rr左移,符合就让ll右移并更新ansans

      显而易见,ansans最后一定是最优结果

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e5+7;
      int n,c,dis[N];
      bool check(int ds){
      	int cnt=1,place=0;
      	for(int i=1; i<n; i++){
      		if(dis[i]-dis[place]>=ds){
      			place=i;
      			cnt++;
      		}
      	}
      	if(cnt>=c)return true;
      	return false;
      }
      int main(){
      	cin>>n>>c;
      	for(int i=0; i<n; i++)
      		cin>>dis[i];
      	sort(dis,dis+n);
      	int l=0,r=dis[n-1]-dis[0],ans=0;
      	while(l<r){
      		int mid=l+(r-l)/2;
      		if(check(mid))ans=mid,l=mid+1;
      		else r=mid;
      	}
      	cout<<ans;
      	return 0;
      }
      
      
      • 0
        @ 2025-7-26 10:22:57
        #include<bits/stdc++.h>
        using namespace std;
        int a[200005],c,n,l,r;
        int ch(int x){
        	int z=1,w=a[1];
        	for(int i=2;i<=n;i++) {
        		if(a[i]-w>=x) {
        			w=a[i];
        			z++;
        		}
        	}
        	return z>=c;
        }
        int main(){
        	cin>>n>>c;
        	for(int i=1;i<=n;i++) {
        		cin>>a[i];
        	}
        	sort(a+1,a+1+n);
        	l=0,r=1e9+7;
        	while(l+1<r) {
        		int mid=(l+r)/2;
        		if(ch(mid)) {
        			l=mid;
        		}else{
        			r=mid;
        		}
        	}
        	cout<<l;
        	return 0;
        }
        
        
        • -1
          @ 2024-12-30 13:11:20
          #include<cstdio>
          #include<algorithm>
          using namespace std;
          const int inf=0x7fffffff;
          int n,m,a[100001];
          int solve(){
              int l=0,r=inf,mid,now,tot;
              while(l<r){
                  mid=(l+r+1)>>1;
                  now=a[1];
                  tot=1;
                  for(int i=2;i<=n;++i){
                      if(a[i]-now>=mid)now=a[i],++tot;
                      if(tot>=m)break;
                  }
                  if(tot<m)r=mid-1;
                  else l=mid;
              }
              return l;
          }
          int main(){
              scanf("%d%d",&n,&m);
              for(int i=1;i<=n;++i)scanf("%d",&a[i]);
              sort(a+1,a+n+1);
              printf("%d",solve());
          }
          
          • 1

          [USACO05FEB] 进击的奶牛 Aggressive Cows G

          信息

          ID
          5879
          时间
          1000ms
          内存
          125MiB
          难度
          3
          标签
          递交数
          61
          已通过
          27
          上传者