HDU4682 The Happy Triangles
来源:互联网 发布:软件测试作业 编辑:程序博客网 时间:2024/06/15 20:37
二分法的好题,推荐!
题目见http://acm.hdu.edu.cn/showproblem.php?pid=4682
解法需要先证明两个结论,这两个结论都是基于最优策略的,可以证明若不满足这两个条件中的任一个都可以通过调整使其变得更优。
1. 每个三角形都应该把最短边与底线重合。
2. 存在重叠时,所有三角形之间的交点以及三角形与左右两条竖线的交点应该在同一水平线上。
(证明的话,我就不赘述了,详见解题报告。其实很简单,自己YY下也可以证明的。)
知道这两点,然后只需要二分交点的高度就可以了。
PS:这题的精度要求虽然只有小数点后3位,但是由于大量的计算,实际对精度的要求很高,因此对采用的算法也有一点要求。
#include <cstdio>#include <cmath>const int maxn = 1010;const double PI = acos(-1.0);const double eps = 1e-9;int T, cas = 1, n;double r, a[maxn], b[maxn], c[maxn];double area[maxn], height[maxn];double f(double h){ double ret = 0; for (int i=1;i<=n;i++) if (h < height[i]) ret += a[i] * (1.0 - h / height[i]); return ret;}int main(){ scanf("%d", &T); while (T--) { scanf("%d%lf", &n, &r); for (int i=1;i<=n;i++) scanf("%lf%lf%lf", &a[i], &b[i], &c[i]); for (int i=1;i<=n;i++) { double p = (a[i] + b[i] + c[i]) / 2; area[i] = sqrt(p * (p-a[i]) * (p-b[i]) * (p-c[i])); height[i] = area[i] * 2 / a[i]; } double low = 0, high = 100000, mid; int tt = 60; while (tt--) { mid = (low + high) / 2; if (f(mid) <= r) high = mid; else low = mid; } double ans = 0, h = mid; for (int i=1;i<=n;i++) if (h < height[i]) ans += area[i] - h*a[i]*(h/height[i])/2; printf("Case #%d: %.3lf\n", cas++, ans); }return 0;}
- HDU4682 The Happy Triangles
- nyoj18 The triangles 【DP】
- hdu 3549 Enumerate the Triangles
- hduoj 3548 Enumerate the Triangles
- The Happy Door
- The Happy Worm(poj1974)
- FOJ1176 The Happy Worm
- The Happy Worm
- Triangles
- Triangles
- Triangles
- Triangles
- Triangles
- Triangles
- poj 1974 The Happy Worm
- FOJ 1176 The Happy Worm
- HDU NO.3548 Enumerate the Triangles
- codechef Chef and The Right Triangles 题解
- .Net之路(七)website和webapplication
- 透
- Mysql alter语法
- UVA 10400 Game Show Math (dfs + 记忆化搜索)
- 新解法之翻转句子中单词的顺序(不用两次翻转,用两个指针)
- HDU4682 The Happy Triangles
- 修改eclipse的背景色
- poj 2513 欧拉路+Trie树+并查集
- uva 11800 - Determine the Shape
- 《sort帮你排序》-linux命令五分钟系列之二十六
- hdu 4587
- UVa11995 I Can Guess the Data Structure!
- do while(0)在宏定义中的应用
- jdk和tomcat的配置