思路
先将所有牛按位置排序。随后二分间隔的最大值。check的时候如果位置不够加了,那么需要的间隔就加。
代码
#include<bits/stdc++.h> #define debug(x) cout<<"x="<<x<<endl #define int long long using namespace std; const int maxn=1e5+7; const int mod=1e9+7; typedef long long ll; //ifstream mycin("in.txt"); //ofstream mycout("out.txt"); inline void read(int &data){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=f*-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} data=x*f; } int n,m,a[maxn]; bool check(int x){ int num=1,now=a[1],idx=1; for(int i=2;i<=n;i++){ if(a[i]-a[idx]>=x) num++,idx=i; } if(num>=m) return true; else return false; } signed main(){ read(n);read(m); for(int i=1;i<=n;i++) read(a[i]); sort(a+1,a+1+n); int l=0,r=1e9+7,mid; while(r-l>1){ mid=l+r>>1; if(check(mid)) l=mid; else r=mid; } cout<<l<<endl; return 0; }