uvalive 3708 Graveyard

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 }
原文地址:https://www.cnblogs.com/kickit/p/7569354.html