LA3708 Graveyard --思维的体操

来源:互联网 发布:twisted windows 编辑:程序博客网 时间:2024/05/01 14:11

题目链接

点击打开链接

题目意思

在一个周长为10000的圆上等距离分布折n个雕塑,现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布,这就需要移动一些原有的雕塑。要求n个雕塑移动的距离和最小。

题目分析

仔细分析样例,3个样例有一个共同特点,即有一个雕塑没有移动,如果该特点成立,那么其他的雕塑位置已经确立。我们不放设没动的雕塑坐标为0,其他的n+m个雕塑的编号分别为1,2,。。。,再根据此坐标计算出初始的n个雕塑的坐标,例如n=3,m=1时,移动后的雕塑坐标为0,1,2,3;移动前的雕塑坐标为0,4/3,8/3;再计算出坐标向邻近两个坐标中移动;最小距离。注意,此坐标是按10000/(m+n)比列得来的坐标,最后需要转换回去。具体为什么会有一个雕塑不动,参考刘汝佳训练指南P4.

AC代码:

#include <stdio.h>#include <cmath>#include <iostream>using namespace std;int main(){    int n,m;    while(scanf("%d%d",&n,&m) != EOF)    {        double ans = 0.0;        for(int i=1;i<n;i++)        {            double pos = (double)i/n*(m+n);            ans += fabs(pos - floor(pos + 0.5)) /(m+n);         }  //floor为取整函数,得到pos四舍五入后的整数值        printf("%.4lf\n",ans*10000);    }    return 0;}


0 0
原创粉丝点击