uva 1388 Graveyard
2013-09-15 14:28
253 查看
这道题要总共的雕像的移动距离最短,那么只需要把每一个雕像移动到离它最近的位置就行了,在解题之前需要证明两点:
1.排在最前面的雕像不用移动(这个是显然的)
2.两个雕像移动之后不可能在同一个位置(按照距离最短的原则移动每一个雕像,不可能出现两个雕像移动到同一个位置的情况),用反证法比较好证明,
只要两个雕像移动到了同一个位置,最后可以推导出的结果是,增加了 雕像的数量,平均距离反而增加了,这是和题设矛盾的,所以两个雕像不可能移动到
同一个位置。
在进行实际的代码编写的时候,用到了一个小技巧,将一圈的距离设为n+m,那么增加雕像之后的平分点的坐标就都是整数,原来的雕像的坐标点是小数,那么只需要
将这些小数坐标的点移动到与其相邻的整数点,那么距离总和就最小了,最后的答案再乘以10000就行了。
下面是AC代码:
1.排在最前面的雕像不用移动(这个是显然的)
2.两个雕像移动之后不可能在同一个位置(按照距离最短的原则移动每一个雕像,不可能出现两个雕像移动到同一个位置的情况),用反证法比较好证明,
只要两个雕像移动到了同一个位置,最后可以推导出的结果是,增加了 雕像的数量,平均距离反而增加了,这是和题设矛盾的,所以两个雕像不可能移动到
同一个位置。
在进行实际的代码编写的时候,用到了一个小技巧,将一圈的距离设为n+m,那么增加雕像之后的平分点的坐标就都是整数,原来的雕像的坐标点是小数,那么只需要
将这些小数坐标的点移动到与其相邻的整数点,那么距离总和就最小了,最后的答案再乘以10000就行了。
下面是AC代码:
#include <stdio.h> #include <math.h> int main(void) { int m, n; int i; double pos; double sum; while(scanf("%d %d",&n,&m) != EOF) { sum = 0.0; for(i=1; i<n; i++) { pos = (m+n)/(double)n * i; sum += fabs( pos - floor(pos+0.5) ) / (m+n); } printf("%.4lf\n", sum*10000); } return 0; }
相关文章推荐
- UVA1388 - Graveyard
- UVa 1388 - Graveyard
- UVa1388 - Graveyard
- UVA之1388 - Graveyard
- UVA 1388 - Graveyard (推理,参考系)
- uva 1388 - Graveyard(思维)
- uva1388 Graveyard
- uva 1388 - Graveyard(思维)
- UVA - 1388 Graveyard 【数学】
- UVA 1388 Graveyard
- UVa 1388 - Graveyard
- uva - UVA 1388 - Graveyard (数学推理)
- uva1388 Graveyard
- UVA-1388 - Graveyard-2014年4月20日021827
- uva 1388 - Graveyard
- UVA 1388 Graveyard
- uva 1388 - Graveyard(数论)
- uva1388 Graveyard
- uva 1388 - Graveyard(贪心)
- UVA - 1388 Graveyard 四舍五入