墓地分配雕塑问题
问题:在一个周长为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 个雕塑后的位置也可以确定,要做的就是确定要移动的每个雕塑离哪个新位置最近。