1 solutions

  • 0
    @ 2025-3-3 16:21:27

    C++ :

    #include<iostream>
    #include<cstdio> 
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int A[1000010];
    int n,c,a;
    bool check(int x)//判断此答案是否可行 
    {
        int num=0;
        int l=A[1];//l记录上一只牛的位置,开始时第一只牛一定在第一个牛栏 
        for(int i=2;i<=n;i++)//依次枚举每个牛栏 
        {
            if(A[i]-l<x) num++;//若此距离不满足当前答案,那么需要的牛栏数+1,即把当前牛放到下一个牛栏 
            else l=A[i];//否则就更新上一次的牛栏位置 ,即上一头牛放的位置 
            if(num>a) return false;// 若需要牛栏数大于最大牛栏数,此答案不可行 
        }
        return true;//反之,若需要牛栏数小于最大需要牛栏数,此答案可行
    }
    int main()
    { 
      scanf("%d%d",&n,&c);
      for(int i=1;i<=n;i++)
        scanf("%d",&A[i]);
      sort(A+1,A+n+1);//由于无序,需排序(sort默认从小到大,不用写规则) 
      a=n-c;//最大剩余牛栏数 
      int l=1;//二分的左界,从1开始,即可能情况的最小值 
      int r=A[n]-A[1];//二分右界,即可能情况的最大值 
      while(l+1<r)//若左<右,则继续二分答案 
      {
          int mid=(l+r)/2;//二分 两区间分别为l ~ mid    ,     mid ~ r;
          if(check(mid)) l=mid;//若此答案可行,从mid ~ r区间继续查找(更大答案),即修改左界l=mid 
          else r=mid;//反之,若此答案不可行,从l ~ mid区间查找(合理答案),即修改左界l=mid 
      }
      if(check(r)) printf("%d",r);//若可行解为右界,输出右界 
      else printf("%d",l);//若可行解为左界,输出左界 
      return 0;
    }
    
    • 1

    Information

    ID
    9952
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By