Distinct_二分
来源:互联网 发布:小企业免费会计软件 编辑:程序博客网 时间:2024/06/16 06:55
题目描述
Daniel 正在玩一个战棋游戏。
现在Daniel 有n 队士兵站在x 轴上。第i 队士兵有ai 人,坐标为xi。
Daniel 看到一队士兵有这么多人,都站在同一个位置,他对此很不满意。他
想命令一些士兵移动到新的位置(必须是整点),使得不存在两个士兵站在同一个
位置。
为了节约时间,Daniel 希望每个士兵的移动距离的最大值尽可能小。请求出这个最小值。
思路
用jp的话来说 ,求最大的最小值很有可能是二分答案
二分一个数m,显然每一队士兵可以走[x-t,x+t]这个区间,那么设从最左边开始走,走到最右边就是 l+a[i], 如果这个值>x+t 那说明这个答案是不行的,继续二分,如果可行,那下一队士兵的开始点就为max(l+a[i],x-t)
#include <stdio.h>#define maxn 100001#define INF 0x7f7f7f7fint a[maxn], b[maxn];int n;int chack(int t){ int l = -INF; for (int i = 1; i <= n; i++) { int xl = b[i] - t, xr = b[i] + t; if (l < xl) l = xl; if (l + a[i] - 1 > xr) return 0; l += a[i]; } return 1;}int main(){ freopen("distinct.in", "r", stdin); freopen("distinct.out", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); int l = -1, r = INF; while (l + 1 < r) { int m = (l + r) >> 1; int xx = chack(m); if (xx == 1) r = m; else l = m; } printf("%d\n", r);}
阅读全文
1 1
- Distinct_二分
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分。
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分~~
- 二分
- 二分
- 设计模式(一)-单例模式
- python学习三(字符)
- Unity Canvas Sort Order
- Kotlin学习笔记
- JTextFieldTest文本框组件--登录
- Distinct_二分
- 基于STM32F103WIFI视频小车制作(一)
- sublime text 中evernote插件注册问题
- (44)曲线编辑器
- 数据库的三大范式+BCNF
- 学习kafka:log4j写入kafka
- iOS中堆和栈的区别
- python HTTP请求--requests 的使用
- 【软考总结】记米老师讲课