> 文档中心 > C++墓地雕塑

C++墓地雕塑

问题描述

2397年,编程竞赛变得如此受欢迎,以至于 New Earck
的州长——银河系中最大的人类居住的行星——在当地的墓地开辟了一条选手纪念小巷(ACM)。

小巷环绕着一个绿色公园,并拥有著名的全息雕像,沿公园周边等距离放置。当一组新的雕像到达时,这条小巷必须不时更新。

当增加新的雕像时,每个雕像的确切位置可以沿着小巷任意选择,但是,必须通过沿着小巷移动一些老雕像来保持等距布置。

令人惊讶的是,人类在24世纪仍然很迷信:墓地管理员相信全息雕像保存着死人的灵魂,因此,总是试图用现存雕像的最小可能运动来更新小巷(此外,全息设备很重)。雕像只能沿着公园周边移动。

你的工作是找到一个方案,使所有雕像的移动距离之和最小化。安装一个新的全息雕像不增加距离,所以请明智地选择新来雕像的位置!

输入

输入文件包含几组测试数据,每组测试数据仅一行,包含两个整数n和m。

n-最初位于小巷的全息雕像的数量,m-要添加的雕像的数量(2≤n≤1000,1≤m≤1000)。沿着公园周边的小巷长度正好是10000英尺。

输出

每组测试数据,输出一个实数,表示所有雕像的最小移动距离之和(以英尺为单位)。答案必须精确到小数点后至少4位。

Sample Input2 12 33 110 10Sample Output1666.66671000.01666.66670.0

注:
输入的前三组数据如图所示。黑色柱表示原始雕像,空圆表示新的等距位置,箭头表示现有雕像的运动计划。

C++墓地雕塑

CODE

#include #define for_0(i,n) for(i=0;i<(n);i++)using namespace std;typedef double db;double acm(int n,int m){db p = 0;int i,j = 1;for_0(i,n){while(i*m > j*n)  j++;p += min((db)j/m-(db)i/n,(db)i/n-(db)(j-1)/m);}return p*10000;}int main(){int n,m;while(~scanf("%d%d",&n,&m))printf("%.4lf\n",acm(n,n+m));return 0;}

关注我,天天赞天天看!