uva 1473 - Dome of Circus (几何 + 二分)
2015-08-15 10:00
411 查看
题目链接:uva 1473 - Dome of Circus
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 10005; const double inf = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-9; struct Point { double x, y; Point (double x = 0, double y = 0): x(x), y(y) {} bool operator < (const Point& u) const { if (fabs(x - u.x) > eps) return x > u.x; return y > u.y; } }p[maxn]; double slope(Point a, Point b) { if (fabs(a.x - b.x) < eps) return 0; return (a.y - b.y) / (a.x - b.y); } int N, M; void init () { double x, y, z; for (int i = 0; i < N; i++) { scanf("%lf%lf%lf", &x, &y, &z); p[i].x = sqrt(x * x + y * y); p[i].y = z; } sort(p, p + N); /* M = 0; for (int i = 1; i < N; i++) { if (p[i].y - p[M].y < eps) continue; while (M && slope(p[i], p[M-1]) < slope(p[M], p[M-1])) M--; p[++M] = p[i]; } */ /* for (int i = 0; i <= M; i++) printf("%lf %lf\n", p[i].x, p[i].y); */ } double find (double r) { double ret = 0; for (int i = 0; i < N; i++) ret = max(ret, p[i].y * r / (r - p[i].x)); return ret; } void solve () { double l = p[0].x, r = 1e10; while (fabs(r - l) > eps) { double rl = l + (r - l) / 3; double rr = r - (r - l) / 3; double hl = find(rl); double hr = find(rr); if (rl * rl * hl > rr * rr * hr) l = rl; else r = rr; } printf("%lf %lf\n", find(l), l); } int main () { while (scanf("%d", &N) == 1) { init (); solve (); } return 0; }
相关文章推荐
- meta标签viewport详解
- 串口入门知识及总结
- Android开发中使用SharedPreferences记录用户是否第一次启动程序
- 01背包
- Android休眠唤醒和wakeup_source机制的使用(2)
- JSP学习笔记(一)
- java中Statement详细用法
- Python开发环境的搭建(win7)
- python 数值类型,判断类型
- Java 创建型模式:单态模式,原型模式,工厂方法,抽象工厂,建造者模式
- 设计模式--观察者模式
- Android开发专栏之ListView一两种适配器的使用和优化
- extends ActionBarActivity 出现的问题
- Spring常用annotation标签
- [LintCode] Count 1 in Binary
- 手动编译安装nginx
- iOS 代理为啥要用weak修饰? (刨根问底一)
- 字典树模板
- 霓歌即时通讯中的相关专利整理(七)
- jQuery实现图片渐入渐出切换展示效果