Uva 3708 Graveyard

题意:在周长为10000的圆上等距分布着n个雕塑。现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布。

这就需要移动其中一些原有的雕塑。要求n个雕塑移动的距离最小。

(2<=n<=1000,1<=m<=1000)

 

题解:这道题,可以发现可以先固定一个位置为不动点,这样所有雕塑的最终位置就已经确定,然后依次循环寻找出原位置以及最终位置,

然后将原位置的每个雕塑移动到最近的新的位置。

这是就会有一个歧义,会不会有两个重叠的雕塑移动到同一个位置呢?答案是不会的,因为,是均匀分布,也就是说刚开始的间隔绝对比新的间隔大

若两个移动到同一个位置,就说明刚开始的间隔比新的间隔小,与已知不符,所以不可能,所以可以放心大胆,模拟即可。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<string>

using namespace std;
const int MAXN=2007;

int n,m;

double min(double a,double b)
{
    return a>b?b:a;
}
int main()
{
    while (~scanf("%d%d",&n,&m))
    {
        double ans=0;
        double a[MAXN],b[MAXN];
        
        a[1]=0;
        for (int i=1;i<n;i++)
            a[i]=(double)10000*1.0/n*i;
        
        b[1]=0;
        for (int i=1;i<m+n;i++)
            b[i]=(double)10000*1.0/(n+m)*i;
        
        int i=1,j=1;
        while (i<n&&j<m+n)
        {
            if (b[j+1]<a[i]) j++;
            else 
            {
                ans+=min(abs(a[i]-b[j]),abs(b[j+1]-a[i]));
                i++,j++;
            }
        }        
        printf("%.4f\n",ans);
    }
}

 

posted @ 2017-06-11 14:58  Kaiser-  阅读(113)  评论(0编辑  收藏  举报