poj2456 Aggressive cows(二分查找)

https://vjudge.net/problem/POJ-2456

二分,从最大长度开始,不断折半试,如果牛全放下了,就是可行,修改下界,否则改上届。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<map>
 8 #define lson l, m, rt<<1
 9 #define rson m+1, r, rt<<1|1
10 #define INF 0x3f3f3f3f
11 typedef unsigned long long ll;
12 using namespace std;
13 int n, m, a[100010];
14 int C(int x)
15 {
16     int pre=0, ans=1;
17     for(int i = 1; i < n; i++){
18         while(i < n&&a[i]-a[pre]<x){
19             i++;
20         }
21         if(i>=n) break;
22         ans++;
23         pre = i;
24     }
25     return ans >= m;
26 }
27 int main()
28 {
29     while(~scanf("%d%d", &n, &m)){
30         for(int i = 0; i < n; i++){
31             scanf("%d", &a[i]);
32         }
33         sort(a, a+n);
34         int lb = 0, ub = INF;
35         while(ub-lb>1){
36             int mid = (ub+lb)/2;
37             if(C(mid)){
38                 lb = mid;
39             }
40             else ub = mid;
41         }
42         printf("%d\n", lb);
43     }
44     return 0;
45 }

原文地址:https://www.cnblogs.com/Surprisezang/p/9027822.html

时间: 2024-10-11 16:53:15

poj2456 Aggressive cows(二分查找)的相关文章

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

[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

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

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

[POJ2456]Aggressive cows

题目链接: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 = 1

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];