牛场主的烦恼

这道题目亿看就是二分,因为假设间距为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 }

浙公网安备 33010602011771号