理论: 二分查找(2): 假定一个解并判断是否可行
来源:互联网 发布:淘宝专享红包幸运抽奖 编辑:程序博客网 时间:2024/06/13 20:10
例题
有N条绳子, 他们的长度分别为Li。 如果他们中切割出k条长度相同的绳子的话, 这K条绳子每条最长能有多长? 答案精确到小数点后两位。
二分查找分析
这个问题用二分查找可以非常容易的求得答。 然我们套用二分搜索的模型试着解答这个问题。
令:
条件C(x):= 可以得到K条程度为X的绳子
则问题就变成了满足c(x)条件的最大x的问题。 在初始化区间的时候, 只需要使用充分大的数INF作为上界即可。(设置一个无穷大INF 远比统计数列的最大值省时间)
const int INF = Oxfffffff;int l = 0int u = INF
现在的问题是如何搞笑的判断c(x)是否可行。 由于长度为Li的绳子最多可以切出floor(Li / x)段长度的绳子, 因此
C(x) = (floor(l / x)的总和是否大于或等于K)
这道题可以在0(N)的时间中判断出来。
代码
int n, k;double a[100000000];bool check(double t){ int num = 0; for (int i = 0; i < n; i++) num += (int)(a[i] / t); return num >= t;}double find(void){ double l = 0, u = INF; for (int i = 1; i <= 100; i++) { double mid = (l + u) / 2; if (check(mid)) l = mid; else u = mid; } return u;}int main(void){ while (scanf("%d %d", &n, &k) != EOF) { for (int i = 0; i < n; i++) scanf("%lf", &a[i]); double ans = find(); printf("%.2lf\n", ans); } return 0;}
就像上文在求解最大化或者最小化的过程中, 能偶比较简单的判断条件是否满足, 那么就使用二分查找法就可以很好的解决问题。
有关结束的判定
在输出小数的问题中一般都会指定允许的无法范围, 或者输出指定范围中的小数点后面的位数。因此在二分搜索法的时候, 有必要设置合理的结束条件来满足精度的要求。 在上述的程序中, 我们指定了循环次数作为终止条件。 一次循环可以把区间的范围缩小一半, 100次的循环则可以达到 1e-30 的精度, 基本上是没有问题的。 除此之外 , 也可以把终止条件设为像(u - l) > EPS 这样, 指定一个区间大小, 在这种情况下, 如果EPS过小, 就有可能应为浮点数小数精度的原因导致死循环, 千万小心。
0 0
- 理论: 二分查找(2): 假定一个解并判断是否可行
- Cable master(假定一个解并判断是否可行)(POJ NO.1064)
- hdoj 3715 Go Deeper 【2-sat 判断可行解 + 二分】
- poj 1064 二分查找变形—判定并找到可行解
- Light oj 1251 - Forming the Council 【2-sat】【判断是否存在可行解 + 反向拓扑输出可行解】
- 二分查找法及判断一个数组中是否有两个元素之和为指定值
- 判断一个图是否为二分图
- 栈入门(判断出栈顺序是否可行)
- POJ 1064 切绳子 二分搜索求一个可行解
- 判断给定的二叉树是否为二分查找树
- Light OJ 1407 - Explosion 【2-sat之 3布尔变量的处理 — 枚举所有状态判断是否存在可行解 + 反向输出可行解】【好题】
- 判断二分查找树A是否是二分查找树B的子树
- 理论: 二分查找(1):基础样例
- 查找Table中的单个列长度并判断是否属于改表(存储过程)
- 快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!
- 快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!
- 快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!
- 快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!
- android ImageView点击时背景图修改(简单方法)
- 查找 替换 细节
- 入坑单片机第一天
- Springmvc学习篇(3)之参数绑定
- lightoj 1281 - New Traffic System
- 理论: 二分查找(2): 假定一个解并判断是否可行
- libcurl使用1:用get请求方式+图灵机器人接口实现智能聊天系统
- JUnit Assert方法总结
- [微积分学习]Day 3.极限不等于A及例题
- 问题汇总
- CodeForce 614B Gena's Code 巧用字符串
- POJ-1942-Paths on a Grid-组合水题
- Python乱码处理方式
- 无偏估计【统计学-通俗解释】