[POJ] 2456 Aggressive cows (二分查找)
题目地址:http://poj.org/problem?id=2456
最大化最小值问题。二分牛之间的间距,然后验证。
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #include<time.h> 8 #include<stdlib.h> 9 #include<map> 10 #include<stack> 11 #include<queue> 12 #include<vector> 13 using namespace std; 14 #define clr(x,y) memset(x,y,sizeof(x)) 15 #define sqr(x) ((x)*(x)) 16 #define rep(i,a,b) for(int i=(a);i<=(b);i++) 17 #define LL long long 18 #define INF 0x3f3f3f3f 19 #define A first 20 #define B second 21 const int N=100000+131; 22 int n,m, 23 a[N]; 24 25 bool check(int d) 26 { 27 int last=0; 28 for(int i=1;i<m;i++) { 29 int crt=last+1; 30 while(crt<n && a[crt]-a[last]<d) { 31 crt++; 32 } 33 if(crt==n) return false; 34 last=crt; 35 } 36 return true; 37 } 38 39 void solve() 40 { 41 sort(a,a+n); 42 int lb=0,ub=INF; 43 44 while(ub-lb>1) { 45 int mid=(lb+ub)/2; 46 if(check(mid)) { 47 lb=mid; 48 } else { 49 ub=mid; 50 } 51 } 52 printf("%d\n",lb); 53 } 54 55 int main() 56 { 57 scanf("%d%d",&n,&m); 58 for(int i=0;i<n;i++) { 59 scanf("%d",&a[i]); 60 } 61 solve(); 62 63 return 0; 64 }