原题链接:Aggressive cows

题目大意:农夫 建造了一座很长的畜栏,它包括  个隔间,这些小隔间依次编号为. 但是, 的  头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。 决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?

题目分析:题意想要表达的是 头牛放到个带有编号的隔间里,使得任意两头牛所在的隔间编号的最小差值最大。这是一个典型的最小值最大化问题。先对畜栏编号从小到大排序,则最大距离不会超过两端的两头牛之间的差值,最小值为。所以我们可以通过二分枚举最小值来求。假设当前的最小值为,如果判断出最小差值为时可以放下头牛,说明当前的有点小,就先让变大再判断;如果放不下,说明当前的太大了,就先让变小然后再进行判断。直到求出一个最大的就是最终的答案。


代码如下:(PS:输入输出用  )

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; const int MAX = 100005;
int num[MAX];
int n, c; bool tanxin(int x) { // 判断 x 时,是否可以放得下 c 头牛
int cnt = 1, temp = num[0]; for (int i = 1; i < n; i++) {
if (num[i] - temp >= x) {
cnt++;
temp = num[i];
if (cnt == c) return true;
}
}
return false;
} void erfen() { // 通过二分枚举最小值
int left = 0, right = num[n - 1] - num[0]; while (left <= right) {
int mid = (left + right) / 2;
if (tanxin(mid)) left = mid + 1;
else right = mid - 1;
} printf("%d\n", left - 1);
} int main() {
scanf("%d %d", &n, &c); for (int i = 0; i < n; i++)
scanf("%d", &num[i]); sort(num, num+n); erfen(); return 0;
}

最新文章

  1. python 04
  2. vc中获取磁盘IO统计计数
  3. HTTP基本认证
  4. java多线程-线程通信
  5. java 异常处理 Throwable Error 和Exception
  6. Alpha
  7. JUnit 4 如何正确测试异常
  8. Xamarin.Android 入门之:Bind java的jar文件+Android显示gif图片
  9. PLSQL游标使用
  10. 什么是vue?
  11. 如何使用angular-ui的弹出框
  12. 用php+ajax新建流程(请假、进货、出货等)
  13. jq与原生js实现收起展开效果
  14. Mac HomeBrew 常用命令
  15. 将 windows 目录结构 复制到 linux 上
  16. 使SourceInsight支持Python语言的方法
  17. Win10系列:C#应用控件基础2
  18. ASP.Net MVC 中EF实体的属性取消映射数据库、自定义名称
  19. (转)android拨打电话崩溃6.0以上实时动态权限申请
  20. Hive为什么要分桶

热门文章

  1. ios导出ipa文件
  2. [BUUCTF]PWN12——[BJDCTF 2nd]r2t3
  3. Spring 5| 轻量级的开源JavaEE框架
  4. Python第三周 数据类型:集合set、文件的读写、追加操作。
  5. Qt-Vnc远程
  6. 【LeetCode】513. Find Bottom Left Tree Value 解题报告(Python & C++ & Java)
  7. 【LeetCode】875. Koko Eating Bananas 解题报告(Python)
  8. 如何把 MySQL 备份验证性能提升 10 倍
  9. 使用zTree插件实现可拖拽的树
  10. Conditional Generative Adversarial Nets