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

对于本题取ll还是rr的问题,如果拿不准可以每次更新ll,rr的时候同时选择是否更新ans,这样就不用纠结了。二分查找的限界也可以很无脑地记住。

 1 const int maxn = 100010;
 2 int n, c, ans;
 3 int x[maxn];
 4
 5 bool ok(int d) {
 6     int cow = x[1];
 7     int cnt = 1;
 8     for(int i = 2; i <= n; i++) {
 9         if(x[i] - cow >= d) {
10             cnt++;
11             cow = x[i];
12         }
13     }
14     return cnt >= c;
15 }
16
17 int main() {
18     // freopen("in", "r", stdin);
19     while(~scanf("%d %d", &n, &c)) {
20         for(int i = 1; i <= n; i++) {
21             scanf("%d", &x[i]);
22         }
23         int ll = 0;
24         int rr = 0x7f7f7f7f;
25         ans = 0x7f7f7f7f;
26         sort(x+1,x+n+1);
27         while(ll <= rr) {
28             int mm = (ll + rr) >> 1;
29             if(ok(mm)) {
30                 ll = mm + 1;
31                 ans = mm;
32             }
33             else rr = mm - 1;
34         }
35         printf("%d\n", ans);
36     }
37     return 0;
38 }

转载于:https://www.cnblogs.com/kirai/p/4902607.html

[POJ2456]Aggressive cows(贪心,二分查找)相关推荐

  1. poj2456 Aggressive cows(二分查找)

    https://vjudge.net/problem/POJ-2456 二分,从最大长度开始,不断折半试,如果牛全放下了,就是可行,修改下界,否则改上届. 1 #include<iostream ...

  2. 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

    题目传送门 1 /* 2 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 3 当然有可能两个数和超过p,那么an ...

  3. LeetCode 870. 优势洗牌(贪心 二分查找)

    1. 题目 给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述. 返回 A 的任意排列,使其相对于 B 的优势最大化. 示例 ...

  4. poj 2456 Aggressive cows 【二分+最大化最小值】

    题目链接:http://poj.org/problem?id=2456 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 210 ...

  5. POJ2456 Aggressive cows

    题目:http://poj.org/problem?id=2456 思路:二分经典题目,二分答案,判断间隔mid是否能容纳所有的奶牛.不过二分坑点比较多 例如查找值的时候,while里面写<=, ...

  6. POJ 2456 Aggressive cows(二分答案)

    Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22674 Accepted: 10636 Des ...

  7. POJ 2456 - Aggressive cows(二分)

    Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...

  8. 二分入门——poj 2456 aggressive cows

    这是一道二分的神奇贪心题,先上题目 Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11714 A ...

  9. LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 优先队列+贪心 1. 题目 给你一个整数数组 heights ,表示建筑物的高度.另有一些砖块 bricks 和梯子 ladders . 你 ...

  10. codeforces 贪心+优先队列_算法基础04-深度优先搜索、广度优先搜索、二分查找、贪心算法...

    深度优先搜索DFS.广度优先搜索BFS 比较 拿谚语打比方的话,深度优先搜索可以比作打破砂锅问到底.不撞南墙不回头:广度优先搜索则对应广撒网,多敛鱼 两者没有绝对的优劣之分,只是适用场景不同 当解决方 ...

最新文章

  1. 美国 AI 博士一针见血:Python 这样学最容易成为高手!
  2. Python中的str与unicode处理方法
  3. 网络摄像头实时获取信息
  4. ES6+webpack实现Counter
  5. 10074 启用开发者模式 for vs2015rc
  6. Android Studio下载、安装和配置+SDK+tools下载(无敌超级详细版本)
  7. 显示器尺寸对照表_【开屏说】⑦:入手显示器须知的十大参数
  8. 最新版 | 2020李沐《动手学深度学习》中文版pdf重磅开源!
  9. 基本了解云计算是什么东东了
  10. python自动翻译视频字幕_python利用google翻译方法实例(翻译字幕文件)
  11. Calendar日期类使用总结
  12. 华为完成首次6GHz频谱试验;iPhone 支持 Siri 操作关机;Gitlab 禁止使用 Windows|极客头条
  13. 在 Selenium 中使用 Lambdatest 进行跨浏览器测试
  14. 概率统计笔记:共轭分布
  15. 云和恩墨zData多租户整合,青海移动数据库云化起航
  16. 17.你知道哪些设计模式,它们在JDK源码中是怎么体现的
  17. java消息总线ibus_IBUS智能照明总线系统的应用
  18. 律师律所的舆情管控工作如何开展?
  19. 技术能力发展的布朗运动
  20. oracle v session表,Oracle临时表(Session临时表与Transaction临时表)

热门文章

  1. [android] 切换界面的通用处理
  2. systemctl的使用
  3. Linux学习记录--命令与文件的查询
  4. 构建samba文件共享服务器
  5. c#操作Xml(五)
  6. 关于在数据库字段中添加换行符的问题
  7. php上搭建dvwa,使用phpstudy在windows上搭建DVWA
  8. mysql脚本之家_详细讲述MySQL中的子查询操作 (来自脚本之家)
  9. keil5图标变成白色_【网上最简单】Chrome安装后打不开任何页面 amp; 改名后图标变成小白块[30秒解决]...
  10. acm路上的一些感想