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