[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 }

 

posted @ 2015-03-20 09:59  SXISZERO  阅读(214)  评论(0编辑  收藏  举报