UVA1388(刘汝佳白书例题)

UVA1388
题意:一个周长为10000的圆上均匀分布n个雕塑,现在再插入m个雕塑,希望n+m个雕塑也能在这个圆上均匀分布。可能需要移动原有的一些雕塑。问:n个雕塑最小移动的总距离是多少。

思路:首先需要找到原有的n个雕塑在插入m个雕塑后,它们每个的位置。n个雕塑的移动选一个参考点,这个参考点是不动的。所以可以把它看成数轴上的原点。第i个点的位置就是i/n(未移动时),添加了m个雕塑后,相当于把这个数轴变成了n+m,第i个点的位置就是**(i / n) * (n+m)了(未移动)。添加了m个雕塑后每个点都需要分布在i / (n+m)上**,我们需要做的就是找到这n个点各自最近的i / (n+m)的点,这样移动的距离也就最小了。这当中又涉及到了是否会重复以及是否会有一个点不需要移动。(后两个问题在刘汝佳蓝书上有解答)

#include<iostream>
#include<cstdio>
#include<cmath> 
using namespace std;
int main()
{
	double n,m;
	while(scanf("%lf%lf",&n,&m)!=EOF)
	{
		double ans=0;//移动的距离总和
		for(int i=1;i<n;i++)
	   {
		double pos=(double)i/n*(n+m)//数轴总长度由n扩大到n+m后的坐标,
		ans+=fabs(pos-floor(pos+0.5))/(n+m); 
        //floor为向下取整,floor(pos+0.5)决定了向前,向后,不动
       //因为pos=i/n * (n+m),所以floor(pos+0.5)取整,就可以移动到最近的i / (n+m)点上),fabs(...)/(n+m)这里除以(n+m)把数轴缩回1
	   } 
	   printf("%.4lf\n",ans*10000);
	}

	return 0;
} 

如有错误还请斧正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值