题意:
在一个周长为10000的圆上等距分布着n 个雕塑,现在又有m 个新雕塑加入(位置可以随意放置),
希望所有(n+m)个雕塑在圆周上均匀分布,这就需要移动其中一些雕塑,要求n个雕塑移动的总距离尽量小。
【输入格式】
输入包含若干组数据。每组数据仅一行,包含两个整数n和m(2≤n≤1000,1≤m≤1000),即原始雕塑数量和新加雕塑数量。
输入结束标志为文件结束符(EOF)
【输出格式】
输入仅一行,为最小距离,精确到小数后四位。
【样例输入】
2 1
2 3
3 1
10 10
【样例输出】
1666.6667
1000.0
1666.6667
0.0
【代码】
//2019.4.21 墓地雕塑 #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main() { int n, m; while (scanf_s("%d%d", &n, &m) == 2) { double ans = 0.0; for (int i = 1; i < n; i++) { double pos = (double)i / n*(n + m);//计算每个需要移动的雕塑的坐标 ans += fabs(pos - floor(pos + 0.5)) / (n + m);//fabs浮点数取绝对值,floor向下取整,floor(x+0.5)类似round四舍五入 //先计算出需要移动的雕塑坐标,计算移动最短距离,换算成(n+m)比例 } cout <<fixed<<setprecision(4)<< ans * 10000;//格式化输出保留四位小数 } return 0; }