https://vjudge.net/problem/UVALive-3708
题意:
一个长度为10000的圆环上放着n个雕塑,每个雕塑之间的距离均相等,即这个圆环被n个点均分。现在需要加入m个雕塑,这m个雕塑任意放置,但是需要满足放置之后n+m个雕塑均分这个圆环。那么原来的雕塑就需要移动,求原来的雕塑移动的最小总距离。
思路:
首先,我们只需要移动原来的雕塑就可以解决问题,因为后面的m个雕塑可以任意放,所以直接放在安排好的位置上即可。其次,有一个雕塑是不需要移动的,至于为什么,我无法证明,但是可以直观的感觉到(刘汝佳大大用的是中位数这个证明)。所以,我的思路就是将安排好之后的位置求出来,再用原来的雕塑找最近的位置即可,猜测不会有两个雕塑选择相同的地方。一开始认为当m % n == 0 的时候不需要移动任何雕塑,结果证明是错的,因为改了这个就ac了(逃
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std; double a[];
double b[]; int main()
{
int n,m; while (scanf("%d%d",&n,&m) != EOF)
{ for (int i = ;i < n;i++)
a[i] = (double) / n * i; for (int i = ;i < m + n;i++)
b[i] = (double) / (m + n) * i; double ans = ; for (int i = ;i < n;i++)
{
int p1 = lower_bound(b,b+m+n,a[i]) - b;
int p2 = upper_bound(b,b+m+n,a[i]) - b; if (b[p1] == a[i]) continue; //printf("%f %f %f\n",a[i],b[p1-1],b[p2]); ans += min(a[i]- b[p1-],b[p2] - a[i]);
} printf("%.4f\n",ans);
} return ;
}