[二分查找变形]弯曲的木杆(POJ 1905)
来源:互联网 发布:php 两个数组完全相同 编辑:程序博客网 时间:2024/04/19 10:25
这题很有意思,除了一般的程序知识,还用了数学的东西。推导了一些公式什么的。
这次用了两种方法做,层层深入,希望能让大家体会到代码的改良过程
第一步:
#include <iostream>#include <cstdio>#include <cmath>using namespace std;double binary_searsh(double left, double right, double L,double L1){ double mid,L2 = L * L; while (right - left > 1e-6){ mid = (left + right) / 2; // regard mid as h double rt = (4 * mid * mid + L2)/ (8 * mid); double rR = 2*rt *asin(L / (2 * rt)); if (rR < L1){ left = mid; } else { right = mid; } } return mid;}int main(){ double h = 0,L,n,c; while (cin >> L>> n>> c&& c != -1){ h = 0; if (L == 0 || n == 0 || c == 0){ printf("%.3lf\n",0); } else { double L1 = (1 + n * c) * L; double ans = binary_searsh(0,L/2, L, L1); printf("%.3lf\n",ans); } }}
改良:
#include <iostream>#include <cstdio>#include <cmath>using namespace std;double binary_searsh(double left, double right, double L,double L1){ double mid,L2 = L * L; while (right - left > 1e-6){ mid = (left + right) / 2; // regard mid as h double r_2 = mid + L2 / (4 * mid); double rR = r_2 * asin(L / (r_2)); if (rR < L1){ left = mid; } else { right = mid; } } return mid;}int main(){ double h = 0,L,n,c; while (cin >> L>> n>> c&& c != -1){ h = 0; if (L == 0 || n == 0 || c == 0){ printf("%.3lf\n",0); } else { double L1 = (1 + n * c) * L; double ans = binary_searsh(0,L/2, L, L1); printf("%.3lf\n",ans); } }}
改进部分在二分搜索部分,表达式进行处理之后,进行运算次数减少。
总结:
输出精度问题,还是用printf解决的好。
阅读全文
0 0
- [二分查找变形]弯曲的木杆(POJ 1905)
- 变形的二分查找
- 二分查找的变形应用
- 二分查找的一点变形
- 微软的二分查找变形题
- 二分查找之变形
- 二分查找变形
- 变形二分查找法
- 二分查找及其变形
- 一种二分查找变形
- 二分查找变形1
- 二分查找及其变形算法
- 二分查找及其变形总结
- 二分查找及其变形整理
- 【小米笔试题】二分查找算法的变形
- 51nod 1279 扔盘子 (二分查找的变形)
- 算法-分割有序数组后查值-二分查找的变形
- 木杆上的蚂蚁
- 交互设计师如何进行风险预判
- 黄永刚 单晶塑性笔记1
- PHPWAMP配置应该如何修改,Web服务器、php、mysql的具体配置修改
- spring mvc常用注解
- php 导入csv文件
- [二分查找变形]弯曲的木杆(POJ 1905)
- Android关于如何编译 OTA 包以及如何制作 OTA 差分包
- 数据结构(C语言) 线性表 链式存储 单链表
- Cyborg Genes UVA
- 计算机网络基础知识总结
- 样本方差的快速计算-遍历一遍样本集
- Android中IPC的各种方式和优缺点
- 一个故意不通过图灵测试的人工智能
- 最短路径问题