牛场主的烦恼

这道题目亿看就是二分,因为假设间距为n,能满足要求,那么比n小的数一定能满足要求。反正,n不能满足要求,则比n大的数一定不能满足要求,所以可以用二分来找到最大满足要求的间隔。

int l = 1,r = a[N];//针对此题目l与r应当做出相应调整。
while(l+1!=r)
{
    int m=(l+r)>>1;
    if(check(m)) l=m;
    else r=m;
}
return l;//l指向能满足要求的最大间距

下面说一下check函数的思路:

 1 int check(int k)
 2 {
 3     int t=a[1]+k;//t:指下一个牛可以放在哪里
 4     int ans1=1;//ans1:可以放牛的位置的数量
 5     for(int i=2;i<=n;i++)
 6     {
 7         if(a[i]>=t)//如果a[i]点可以放牛
 8         {
 9             t=a[i]+k;//更新下一个点的位置
10             ans1++;//可放牛的位置的数量增加
11         }
12         if(ans1==c) return 1;//如果放牛的位置的数量够了return 1;
13     }
14     return 0;//放牛的位置的数量一直不够return 0;
15 }

程序:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,c,a[100010]={0}; 
 4 int check(int k)
 5 {
 6     int t=a[1]+k;
 7     int ans1=1;
 8     for(int i=2;i<=n;i++)
 9     {
10         if(a[i]>=t)
11         {
12             t=a[i]+k;
13             ans1++;
14         }
15         if(ans1==c) return 1;
16     }
17     return 0;
18 }
19 int main()
20 {
21     cin>>n>>c;
22     for(int i=1;i<=n;i++) cin>>a[i];
23     sort(a+1,a+n+1);
24     int r=a[n]+1,l=1;
25     while(l+1!=r)
26     {
27         int mid=(l+r)/2;
28         if(check(mid)==1)
29         {
30             l=mid;
31         }
32         else r=mid;
33     }
34     cout<<l;
35     return 0;
36 }

 

posted @ 2022-04-24 22:34  王浩泽  阅读(70)  评论(0)    收藏  举报