摘要:
在数轴上求一个点的,使该点到其他所有店的欧氏距离最短
问题链接:
结论推导:
根据基本不等式可知:答案一定是这n个点的中心位置,即n个点坐标的平均值。推导如下:
a
2
+
b
2
>
=
(
a
+
b
)
2
2
a^2+b^2 >=\frac{(a+b)^2}{2}
a2+b2>=2(a+b)2
当且仅当
a
=
=
b
a==b
a==b时等号成立。因此对于方程
(
a
1
−
a
0
)
2
+
(
a
2
−
a
0
)
2
>
=
(
a
1
−
a
0
+
a
2
−
a
0
)
2
2
=
(
a
1
+
a
2
−
a
0
−
a
0
)
2
2
(a_1-a_0)^2+(a_2-a_0)^2>=\frac{(a_1-a_0+a_2-a_0)^2}{2}=\frac{(a_1+a_2-a_0-a_0)^2}{2}
(a1−a0)2+(a2−a0)2>=2(a1−a0+a2−a0)2=2(a1+a2−a0−a0)2
当且仅当
a
1
−
a
0
=
=
a
2
−
a
0
a_1-a_0==a_2-a_0
a1−a0==a2−a0成立时,等号成立。
因此,对于含n个变量的n次均值不等式,均有如上结论,即平均值到其他点的欧氏距离的和最小。
特别注意,由于题目中要求坐标只能是整数,因此需要考虑平均值不是整数的情况,即对平均值和平均值+1对应的距离和作出讨论
代码以及详细注释
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
void function() {
int n;
cin >> n;
vector<int> v;
v.resize(n + 2);
int sum = 0;
for (int i = 1; i <= n; ++i)
{
cin >> v[i];
sum += v[i];
}
sum = sum / n;
int ans1 = 0;
for (int i = 1; i <= n; ++i)
{
ans1 += (sum - v[i]) * (sum - v[i]);
}
int ans2 = 0;
sum++;
for (int i = 1; i <= n; ++i)
{
ans2 += (sum - v[i]) * (sum - v[i]);
}
cout <<min(ans1,ans2)<< endl;
}
};
int main() {
//freopen("in.txt", "r", stdin);
Solution s;
s.function();
return 0;
}