Divide and conquer:Aggressive Cows(POJ 2456)

                

                侵略性的牛

  题目大意:C头牛最大化他们的最短距离

  常规题,二分法即可

  

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <functional>
 4
 5 using namespace std;
 6
 7 static int pos[100000];
 8
 9 bool judge(const int, const int,const int);
10 void solve(const int, const int);
11
12 int main(void)
13 {
14     int n, c;
15     while (~scanf("%d%d", &n, &c))
16     {
17         for (int i = 0; i < n; i++)
18             scanf("%d", &pos[i]);
19         sort(pos, pos + n);
20         solve(n, c);
21     }
22     return 0;
23 }
24
25 void solve(const int n, const int c)
26 {
27     int lb = 0, rb = 1000000001, mid;
28
29     while (rb - lb > 1)
30     {
31         mid = (rb + lb) / 2;
32         if (judge(mid, c, n)) lb = mid;
33         else rb = mid;
34     }
35     printf("%d\n", lb);
36 }
37
38 bool judge(const int dist, const int cows_sum, const int n)
39 {
40     int last_pos = 0, cnt;
41
42     for (int i = 1; i < cows_sum; i++)
43     {
44         cnt = last_pos + 1;
45         while (cnt < n && pos[cnt] - pos[last_pos] < dist)
46             cnt++;
47         if (cnt == n)
48             return false;
49         last_pos = cnt;
50     }
51     return true;
52 }
时间: 2024-10-13 13:38:35

Divide and conquer:Aggressive Cows(POJ 2456)的相关文章

H - Aggressive cows (POJ - 2456)

- 题目大意 农夫约翰搭了一间有n间牛舍的小屋.牛舍排在一条线上第i号牛舍在xi的位置.但是他的m头牛对小屋很不满意,因此经常互相攻击.约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽可能远的牛舍. - 解题思路 很明显是一个最大值最小化的问题,因此我们可以假设C(d)为满足所有牛之间的距离都不小于d.先对牛舍的位置排序,然后二分枚举d,寻找满足条件的d. - 代码 #include<iostream> #include<algorithm> using namespa

Divide and conquer:Telephone Lines(POJ 3662)

电话线 题目大意:一堆电话线要你接,现在有N个接口,总线已经在1端,要你想办法接到N端去,电话公司发好心免费送你几段不用拉网线,剩下的费用等于剩余最长电话线的长度,要你求出最小的费用. 这一看又是一个最小化最大值的问题(也可以看成是最大化最小值的问题),常规方法一样的就是把这个费用二分就好,但是这道题是道图论题,不一定经过所有的点,那我们就以二分基准长度为界限,把小于基准长度的那一部分看成是0,大于等于基准长度的看成是1,这样我们只用SPFA算法算最短路径就可以了,非常的巧妙 参考:http:/

Divide and conquer:Monthly Expense(POJ 3273)

Monthly Expense 题目大意:不废话,最小化最大值 还是直接套模板,不过这次要注意,是最小化最大值,而不是最大化最小值,判断的时候要注意 联动3258 1 #include <iostream> 2 #include <functional> 3 #include <algorithm> 4 5 using namespace std; 6 7 static int money_set[100010]; 8 9 void Search(const int,

Divide and Conquer:River Hopscotch(POJ 3258)

 去掉石头 题目大意:一群牛在河上的石头上跳来跳去,现在问你如何通过去掉M个石头,使得牛跳过石头的最短距离变得最大? 这一题比较经典,分治法的经典,二分法可以很方便处理这个问题,我们只要明白比较函数这个东西就可以了. 模板: while (……) { mid = (lb + rb) / 2; if (Judge_C(……)) else rb = mid; } while判断条件可以根据是整形还是浮点型灵活变换,Judge_C就是比较函数,几乎所有的分治算法都可以这样归纳,我们只要找到合适的比较函

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

题目传送门 1 /* 2 二分搜索:搜索安排最近牛的距离不小于d 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cmath> 7 using namespace std; 8 9 const int MAXN = 1e5 + 10; 10 const int INF = 0x3f3f3f3f; 11 int x[MAXN]; 12 int n, m; 13 14 bool check(int d)

poj 2456 Aggressive cows,二分,最大化最小值

描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗.为了不让牛互相伤害.John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢? 输入 有多组测试数据,以EOF结束. 第

POJ 2456 Aggressive cows 【二分】

Aggressive cows 题目链接:http://poj.org/problem?id=2456 题意:有N个位置,(2 <= N <= 100,000),要在这N个位置放入C头牛(2 <= C <= N),要是牛与牛之间的最小距离最大,求这个最大可能的最小距离. 分析:显然又是一个求最大化最小值的问题,很容易找到这个题的单调性,设这个最大可能的最小距离为Ans,Ans∈(0,(Pos[N-1]-Pos[0])/(C-1) );首先对N个位置进行排序,然后在区间(0,(Pos

[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,...