UVALive3708

来源:互联网 发布:软件可行性分析 编辑:程序博客网 时间:2024/04/29 17:48
题意:在一个周长为10000的圆上等距分布着n个雕塑,现在又有m个新雕塑加入,位置可以随意放,希望所有的n+m个雕塑在圆周上均匀分布,这就需要移动其中一些原有的雕塑,要求n个雕塑移动的总距离最小,输出这个最小值
分析:把点转化为相对坐标,先缩小n倍再放大n+m倍,得到新坐标pos,并取离pos最近的整点,两者之差的绝对值再缩小n+m倍就是需要移动的距离,所有的点的移动距离累加即可。floor(pos+0.5)表示距离pos最近的整数点

代码:

#include <iostream>#include <stdio.h>#include <math.h>using namespace std;int main(){    int n, m;    while(scanf("%d%d", &n, &m)!=EOF){        int i;        double ans = 0;        for(i=1; i            double pos = (i*1.0/n)*(n+m);            double ret = floor(pos+0.5);            ans += fabs(ret - pos)/(n+m);        }        printf("%.4lf\n", ans*10000);    }    return 0;}


原创粉丝点击