Aggressive cows 二分不仅仅是查找

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7083   Accepted: 3522

Description

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000).

His C (2 <= C <= N) cows don‘t like this barn layout and
become aggressive towards each other once put into a stall. To prevent
the cows from hurting each other, FJ want to assign the cows to the
stalls, such that the minimum distance between any two of them is as
large as possible. What is the largest minimum distance?

Input

* Line 1: Two space-separated integers: N and C

* Lines 2..N+1: Line i+1 contains an integer stall location, xi

Output

* Line 1: One integer: the largest minimum distance

Sample Input

5 3
1
2
8
4
9

Sample Output

3

Hint

OUTPUT DETAILS:

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.

Huge input data,scanf is recommended.

Source

USACO 2005 February Gold

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <queue>
11 #include <stack>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 const int INF=0x4fffffff;
16 const int EXP=1e-6;
17 const int MS=100005;
18
19 int pos[MS];
20 int N,M;
21
22 bool judge(int d)
23 {
24       int last=0;
25       int now;
26       for(int i=1;i<M;i++)     //贪心法给第i头牛找宿舍
27       {
28             now=last+1;
29             while(now<N&&pos[now]-pos[last]<d)
30                   now++;
31             if(now>=N)
32                   return false;
33             last=now;
34       }
35       return true;
36 }
37
38 void solve()
39 {
40       sort(pos,pos+N);
41       int l=0,r=INF;
42       while(r-l>1)         //  注意是区间,很多时候开区间更方便一些。
43       {
44             int mid=(l+r)/2;
45             if(judge(mid))
46                   l=mid;
47             else
48                   r=mid;
49       }
50       printf("%d\n",l);
51 }
52
53 int main()
54 {
55       while(scanf("%d%d",&N,&M)!=EOF)
56       {
57             for(int i=0;i<N;i++)
58                   scanf("%d",&pos[i]);
59             solve();
60       }
61       return 0;
62 }
时间: 2024-10-09 12:54:17

Aggressive cows 二分不仅仅是查找的相关文章

poj 2456 Aggressive cows(二分)

// n点中选c点放下c头牛 是的n-1段距离中的最短距离最大 ,求这个最大的最短距离 //假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛, //就先让x变大再判断:如果放不下,说明当前的x太大了, //就先让x变小然后再进行判断.直到求出一个最大的x就是最终的答案. # include <algorithm> # include <string.h> # include <stdio.h> using namespace std; int n,c,i,a

POJ 2456 Aggressive cows (二分 基础)

Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7924   Accepted: 3959 Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...

POJ 2456 Aggressive cows(二分答案)

Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22674 Accepted: 10636 Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,x

[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

SPOJ - AGGRCOW Aggressive cows(二分枚举最优解)

题意:给出n个位置,需要将m头牛放在这些位置中,使得所有相邻两头牛间的最小距离最大,求最大的最小距离: 思路:二分枚举最优解.先将所有位置排序,从最大总距离枚举到0,若满足差值大于等于枚举值的位置个数大于等于m,则当前枚举值为最优解. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m; int num[500100]; int a[500100];

POJ2456 Aggressive cows(二分+贪心)

假设C(d)为满足所有牛之间的距离都不小于d.先对牛舍的位置排序,然后二分枚举d,寻找满足条件的d. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<vector&g

POJ2456 Aggressive cows (二分)

题目链接: http://poj.org/problem?id=2456 题意: 有n个牛舍,位置为xi,c头牛,把每头牛放在与其相邻牛的距离尽量远的牛舍,即最大化相邻两头牛之间的距离,求这个最大距离. 分析: 二分答案,然后O(N)的复杂度判断符不符合. 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace st

[ACM] poj 2456 Aggressive cows (二分查找)

Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5436   Accepted: 2720 Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...

BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #defin