Uva 1388 Graveyard - 水题

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

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

下面是代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值