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

 

你可能感兴趣的:(二分查找)