UVA - 1388 Graveyard
2016-08-21 22:20
423 查看
题目大意:原来有 n 个墓地平分一个圈(周长 10000),后来增加了 m 个,即 n+m 个墓地平分这个圈,要把不在平分点上的墓地移动到合适的位置,问最少移动多少。
解题思路:将圈拉成一条线。假设后来 n+m 个墓地平分之后,每段的距离是 1(坐标是整数),即总长为 n+m,那么原来的每段就是 (n+m) / n,对于第 i 个点,它的坐标就是 (n+m) / n * i,然后把每个点移动到距离它最近的整数点(利用 floor 四舍五入找到这个整数点),用坐标减去整数点就是要移动的距离 ans。注意这个距离是总长度为 n+m 的情况下,假设总长为 10000 是移动的距离为 x,列一个比例式:10000 / x = (n+m) / ans,解得 x = ans / (n+m) * 10000。
解题思路:将圈拉成一条线。假设后来 n+m 个墓地平分之后,每段的距离是 1(坐标是整数),即总长为 n+m,那么原来的每段就是 (n+m) / n,对于第 i 个点,它的坐标就是 (n+m) / n * i,然后把每个点移动到距离它最近的整数点(利用 floor 四舍五入找到这个整数点),用坐标减去整数点就是要移动的距离 ans。注意这个距离是总长度为 n+m 的情况下,假设总长为 10000 是移动的距离为 x,列一个比例式:10000 / x = (n+m) / ans,解得 x = ans / (n+m) * 10000。
#include<iostream> #include<cstdio> #include<cmath> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int main() { int n, m; double a, b, ans, p; while (scanf("%d%d", &n, &m) != EOF) { ans = 0; if (m != n) for (int i = 1; i < n; i++) { p = (double) (n+m) / n * i; ans += fabs(p - floor(p + 0.5)); } printf("%.4lf\n", ans / (n+m) * 10000); } return 0; }
相关文章推荐
- Uva 1388 Graveyard - 水题
- UVA - 1388 Graveyard 四舍五入
- UVA - 1388 Graveyard 【数学】
- UVa 1388 Graveyard 墓地雕塑
- UVA 1388 Graveyard
- NEERC 2006 / UVa 1388 Graveyard (数学&想法题&找最近整数)
- UVA1388 - Graveyard
- uva 1388 - Graveyard(数论)
- UVa 1388 - Graveyard
- Uva 1388 Graveyard 解题报告(数学)
- Graveyard(UVa1388)
- UVA之1388 - Graveyard
- UVA 1388 - Graveyard (推理,参考系)
- uva 1388 - Graveyard(思维)
- uva1388 Graveyard
- uva 1388 - Graveyard(思维)
- uva 1388 Graveyard
- UVA 1388 - Graveyard
- uva1388 Graveyard
- UVa1388 - Graveyard