码迷,mamicode.com
首页 > 其他好文 > 详细

[POJ2456]Aggressive cows

时间:2015-10-22 21:24:08      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://poj.org/problem?id=2456

 

二分+贪心

这是个求最小值最大的问题,我们二分从0到inf的数d,作为两头牛放置的距离不小于d,然后贪心判断。

首先要对x从小到大进行排序,接下来固定x[0]处必有一头牛,然后间距不小于d的时候,可以放置,一直放置,直到所有牛舍均被遍历O(n)。

如果牛被完全放置,那么返回true,并且向右确定边界,反之向左确定。

 

ac代码(32ms):

 1 #include <cstdio>
 2 
 3 const int maxn = 100010;
 4 const int INF = 1 << 30;
 5 int n, m;
 6 int x[maxn];
 7 int ll[maxn>>1], rr[maxn>>1];
 8 
 9 inline bool scan_d(int &x) {
10         char in;bool IsN=false;
11         in=getchar();
12         if(in==EOF) return false;
13         while(in!=-&&(in<0||in>9)) in=getchar();
14         if(in==-){IsN=true;x=0;}
15         else x=in-0;
16         while(in=getchar(),in>=0&&in<=9) {
17                 x*=10,x+=in-0;
18         }
19         if(IsN) x=-x;
20         return true;
21 }
22 
23 inline void printf_d(int a) {
24     if(a > 9) {
25         printf_d(a / 10);
26     }
27     putchar(a % 10 + 0);
28 }
29 
30 void merge(int *x, int p, int m, int q) {
31     int n1 = m - p + 1;
32     int n2 = q - m;
33     int i = 0, j = 0;
34     for(int ii = 0; ii < n1; ii++) ll[ii] = x[p+ii];
35     for(int ii = 0; ii < n2; ii++) rr[ii] = x[m+ii+1];
36     while(i < n1 && j < n2) {
37         if(ll[i] <= rr[j]) x[p++] = ll[i++];
38         else x[p++] = rr[j++];
39     }
40     while(i < n1) x[p++] = ll[i++];
41     while(j < n2) x[p++] = rr[j++];
42 }
43 
44 void mergesort(int *x, int p, int q) {
45     if(p < q) {
46         int m = (p + q) >> 1;
47         mergesort(x, p, m);
48         mergesort(x, m+1, q);
49         merge(x, p, m, q);
50     }
51 }
52 
53 bool ok(int d) {
54     int cow = 1;
55     int tmp = x[0];
56     for(int i = 1; i < n; i++) {
57         if(x[i] - tmp >= d) {
58             cow++;
59             tmp = x[i];
60         }
61     }
62     if(cow >= m) {
63         return true;
64     }
65     return false;
66 }
67 
68 int main() {
69     // freopen("in", "r", stdin);
70     while(scan_d(n) && scan_d(m)) {
71         for(int i = 0; i < n; i++) {
72             scan_d(x[i]);
73         }
74         mergesort(x, 0, n-1);
75         int ll = 0, rr = INF;
76         while(rr - ll > 1) {
77             int mm = (ll + rr) >> 1;
78             if(ok(mm)) {
79                 ll = mm;
80             }
81             else {
82                 rr = mm;
83             }
84         }
85         printf_d(ll);
86         putchar(\n);
87     }
88 }

 

[POJ2456]Aggressive cows

标签:

原文地址:http://www.cnblogs.com/vincentX/p/4902607.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!