uva 1388 - Graveyard(数论)
2015-02-19 21:56
309 查看
题目大意:在一个周长为10000的圆形水池旁有n个等距离的雕塑,现在要再添加m个雕塑,为了使得n + m个雕塑等距离,需要移动一些雕塑,问如何使得移动的总位移最小,输出最小值。
解题思路:可以将周长展成坐标来看,原来的n个雕塑在x[i] = i / n,而移动过后的位置应该在y[i] = i / (n + m),根据贪心的思想,x[i]肯定要移动到最近的y[j]上,问题就解决了,然后就讨论说会不会有两个雕像移动到同一个位置,大白书里给出了很好的反证法,假设有两个雕塑会移动到同一个位置上,0.5 和1.499999,他们计算过后都会移动到1的位置上去,但是n和m都是小于1000的,即使取得最大值,n + m = 2000,
而圆的周长为10000,所以每两个雕塑之间的距离最小为5。
#include <cstdio>
#include <cmath>
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
double ans = 0, pos;
for (int i = 1; i < n; i++) {
pos = (double) i / n * (n + m);
ans += fabs(floor(pos + 0.5) - pos);
}
printf("%.4lf\n", ans / (n + m) * 10000);
}
return 0;
}
解题思路:可以将周长展成坐标来看,原来的n个雕塑在x[i] = i / n,而移动过后的位置应该在y[i] = i / (n + m),根据贪心的思想,x[i]肯定要移动到最近的y[j]上,问题就解决了,然后就讨论说会不会有两个雕像移动到同一个位置,大白书里给出了很好的反证法,假设有两个雕塑会移动到同一个位置上,0.5 和1.499999,他们计算过后都会移动到1的位置上去,但是n和m都是小于1000的,即使取得最大值,n + m = 2000,
而圆的周长为10000,所以每两个雕塑之间的距离最小为5。
#include <cstdio>
#include <cmath>
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
double ans = 0, pos;
for (int i = 1; i < n; i++) {
pos = (double) i / n * (n + m);
ans += fabs(floor(pos + 0.5) - pos);
}
printf("%.4lf\n", ans / (n + m) * 10000);
}
return 0;
}
相关文章推荐
- uva 1388 - Graveyard(数论)
- UVA 1388 Graveyard
- uva 1388 - Graveyard
- uva1388 Graveyard
- UVA之1388 - Graveyard
- 1388 - Graveyard(数论)
- Graveyard(UVa1388)
- UVAlive3708 UVA1388 POJ3154 Graveyard【水题】
- UVA 1388 - Graveyard (推理,参考系)
- UVa1388 - Graveyard (数学,思维)
- UVA - 1388 Graveyard 四舍五入
- UVA-1388 - Graveyard-2014年4月20日021827
- UVA 1388 Graveyard
- UVa1388 - Graveyard
- uva 1388 Graveyard
- uva 1388 - Graveyard
- UVa 1388 - Graveyard
- uva1388 Graveyard
- Uva 1388 Graveyard - 水题
- UVA1388 - Graveyard