【UVALive 11300】

题目链接:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=15133

题目大意:给一个周长为10000的园,圆上等距分布着n个雕塑,现在要新增m个雕塑,要求n+m个雕塑最终也等距,问如何移动这n个雕塑的部分雕塑,让其移动总距离和最小。

 

解题思路:先计算让n+m个雕塑固定(周长是固定的),因为雕塑最终要移到这些位置。再从n+m个点中选择一个固定点,以它为起始再对n-1个点进行圆周上等距分布。这两种情况下的点不一样,可以记为黑与白,让n-1个白点移到离本点最近的黑点算出来的移动距离总和就是最小了。

小知识: floor:下位取整,即取小于等于x的最大整数。

            ceil : 上位取整,即取大于x的最小整数。

 

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cmath>

 4 #include <algorithm>

 5 #include <cstring>

 6 using namespace std;

 7 

 8 int main()

 9 {

10      int  n, m;

11      while(scanf("%d%d",&n,&m)==2)

12      {

13          double ans=0.0;

14          for(int i=1; i<n; i++)

15          {

16              double  p=double(i)/n*(n+m);  //一个点固定,n-1(2~n)个起始点的坐标

17              ans+=fabs(p-floor(p+0.5))/(n+m);

18          }

19          printf("%.4lf\n",ans*10000);  //等比例扩大坐标

20      }

21      return 0;

22 }

 

 

 

你可能感兴趣的:(live)