墓地分配雕塑问题

问题:在一个周长为10000的圆上等距分布着 n 个雕塑。现在又有 m 个新雕塑要加入(位置可随意放),要求所有 n+m 个雕塑在圆周上均匀分布。求,如何移动原有的雕塑,使得n 个雕塑移动的总距离尽量小。

要求:输入包含若干组数据。每组数据仅一行,包含两个整数 n 和 m (2<=n<=1000,1<=m<=1000),即原始的雕塑数量和新加的雕塑数量。输入结束标志为文件结束符(EOF)。 输出格式:输出仅一行,为最小总距离,精确到小数点后四位。

#include<cstdio>
#include<cmath>
using namespace std;

int main(){

int n,m;
while(scanf("%d%d",&n,&m)==2){
    double ans=0.0;
    for(int i=1;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;
}

 

首先,n个雕塑的位置是确定的,加入 m 个雕塑后的位置也可以确定,要做的就是确定要移动的每个雕塑离哪个新位置最近。

 

posted @ 2017-03-23 10:11  神猪学代码  阅读(137)  评论(0编辑  收藏  举报