Graveyard

题意:

在一个周长10000的圆上等距分布n个雕塑,现加入m个,求原先雕塑的最小移动距离

思路:

如果加入的雕塑是n的倍数,那自然不用移动,如果不是,那就求出间距,从一个旧雕塑出发(至少一个不要动)然后逐个选择移动的最小距离。

代码:

#include<cstdio>
#include<iostream>
#include<math.h>
const double len = 10000;
int n, m;
int main() {
	double t, d1, d2;
	while(scanf("%d%d", &n, &m)!=EOF) {
		if(m%n==0) {
			printf("0.0\n");
			continue;
		}
		d1 = len/n*(1.0);
		d2 = len/(n+m)*(1.0);
		double sum = 0;
		for(int i=1; i<n; i++) {
			double t = i * d1;//第i个雕像的位置
			double r = floor(t/d2);处于第几个,自然要四舍五入(更靠近)
			double r1 = fabs(t - r*d2);
			double r2 = fabs(t - (r+1)*d2);
			if(r1 > r2) sum += r2;
			else sum += r1;
		}
		printf("%.4lf\n", sum);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值