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); } }