例题1.4 墓地雕塑 UVa1388

1.题目描述:点击打开链接

2.解题思路:本题的解法颇为巧妙,应用了逆向思维。假设最后这n+m个雕塑已经摆放好,不妨将它们两两之间的距离看做单位1,那么计算之前的位置坐标。这里都以其中一个为圆周上的坐标原点。那么原来的雕塑中第i个的距离是pos=i/n*(n+m),,因此看它离哪个整数比较接近,就移动到那个整数。而选择距离最近的那个整数只用把i/n*(n+m)四舍五入即可,即floor(pos+0.5),这就是本题解法的巧妙之处!这样,累加所有的最短移动距离之后,再扩大10000倍,就是最终的答案。

3.代码:

#define _CRT_SECURE_NO_WARNINGS #include<iostream>#include<algorithm>#include<string>#include<sstream>#include<set>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<functional>using namespace std;int main(){//freopen("t.txt", "r", stdin);int n, m;while (~scanf("%d%d", &n, &m)){double ans = 0.0;for (int i = 0; i < n; i++){double pos = (double)i / n*(n + m);ans += fabs(pos – floor(pos + 0.5)) / (n + m);}printf("%.4lf\n", ans * 10000);}return 0;}

当你感到悲哀痛苦时,最好是去学些什么东西。

例题1.4 墓地雕塑 UVa1388

相关文章:

你感兴趣的文章:

标签云: