假设C(d)为满足所有牛之间的距离都不小于d。先对牛舍的位置排序,然后二分枚举d,寻找满足条件的d。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<vector> #include<cmath> #define ll __int64 #define INF 0x3fffffff using namespace std; int n,m; int x[100005]; bool C(int d) { int num=1; int a=x[0]; int i=1; while(num<m) { if(a+d<=x[i]) { num++; a=x[i]; i++; } else i++; if(i==n) break; } if(num==m) return true; else return false; } void solve() { int l=0,r=x[n-1]+1; while(r-l>1) { int mid=(r+l)/2; if(C(mid)) l=mid; else r=mid; } cout<<l<<endl; } int main() { //freopen("d:\\Test.txt","r",stdin); cin>>n>>m; for(int i=0;i<n;i++) { scanf("%d",&x[i]); } sort(x,x+n); solve(); return 0; }
POJ2456 Aggressive cows(二分+贪心)
原文地址:http://blog.csdn.net/u012198382/article/details/40050499