Atcoder C - Rally(BF | math)

题意:
n n 个人在X轴上,每个人的 位置是 x i x_i ,现在让在 X X 轴上选择一点 p p 作为会议点,每个人到这儿的代价为 ( x i p ) 2 (x_i-p)^2 ,现在让你输出这 n n 个人最小的代价和。
思路:
由于范围极小,直接枚举即可,可如果范围1e9那如何去解?

a n s = ( x x 1 ) 2 + ( x x 2 ) 2 + ( x x 3 ) 2 + . . . . + ( x x n ) 2 ans=(x-x_1)^2+(x-x_2)^2+(x-x_3)^2+....+(x-x_n)^2

= n x 2 2 x ( x 1 + x 2 + x 3 + . . . . + x n ) + ( x 1 2 + x 2 2 + x 3 2 + . . . + x n 2 ) =n\cdot x^2-2\cdot x\cdot(x_1+x_2+x_3+....+x_n)+(x_1^2+x_2^2+x_3^2+...+x_n^2)

我们发现这是个单峰函数,最小值点在 b 2 a \dfrac{b}{-2\cdot a}

由于本题中 p p 只能为整数,所以如果极小值点为小数,我们取它两边的点比较即可。

int n;
int a[105];
int main(){
    int sum = 0;
    cin >> n;
    for(int i = 1;i <= n;++i) cin >> a[i],sum += a[i];
    int d1 = sum/n;
    int d2 = d1 + 1;
    int s1 = 0,s2 = 0;
    for(int i = 1;i <= n;++i){
        s1 += (d1 - a[i])*(d1 - a[i]);
        s2 += (d2 - a[i]) * (d2 - a[i]);
    }
    cout << min(s1,s2);
}
发布了589 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/104457630