Uva 1388 Graveyard - 水题

题目描述:lrj厚白书第一章第四到例题

题目分析:如果插入点的个数是n的倍数,那么不需要移动这n个点。如果想要移动的距离最短,那么不难想象最多只需要要移动(n-1)个点。所以可以在这n个点中选取一个参照点,其它点的位置是相对于该参照点的。所以在没有加入m个点之前,这n个点都有一个相对与参照点的以为坐标pi,那么在插入m个点之后,这n个点会有确定的位置。然后在判断pi与这写位子的最短距离即可。

下面是代码:

#include 
#include 
#include 
const double len = 10000;
int n,m;
double d0,d1;
int main()
{
  while(~scanf("%d%d",&n,&m)) {
    if(m % n == 0) printf("0.0\n");
    else {
      d0 = len / (n * 1.0);
      d1 = len / ((n + m) * 1.0);
      //printf("%.4lf %.4lf\n",d0,d1);
      double ans = 0.0;
      for(int i = 1; i < n; i++) {
	double t = i * d0;
	int d = floor(t/d1);
	double t1 = fabs(t - d * d1);
	double t2 = fabs(t - (d + 1.0) * d1);
	if(t1 > t2) ans += t2;
	else ans += t1;
      }
      printf("%.4lf\n",ans);
    }
  }
  return 0;
}


你可能感兴趣的:(Uva解题报告)