【在数轴上找最优位置,使移动距离最短】
L1-4 破碎的心,无法挽回的距离
题目描述:
YFffffff 最近在感情上遭受了失败,他的心也破碎成了n块碎片,散落在了数轴上的 n 个位置。
你是一个情感修复师,作为 YFffffff 的好友,你试图将这些破碎的心重新聚集到一个位置,希望能将他们拼凑完整。
然而,移动一颗破碎的心会消耗巨大的情感能量,移动距离的平方就是消耗的能量值(即从位置i移动到位置x,消耗能量为(x−i)2)。
每颗破碎的心代表了 YFffffff 一段零碎的回忆,而将它们聚集到一起的过程,象征着试图修复那些无法挽回的感情。
你的任务是找到一个最佳的目标位置整数 x ,使得将所有破碎的心移动到 x 位置所消耗的总情感能量最少。
然而,即使你完成了任务,这些心是否真的能重新完整,仍然是一个未知数……
输入格式:
一个整数n(1≤n≤100),表示破碎的心的数量。
一个长度为n的数组a
,其中a[i]
(1≤a[i]≤100)表示第i
颗破碎的心的位置。
输出格式:
一个整数,表示将所有破碎的心移动到同一位置所消耗的最小总情感能量。
输入样例1
2
1 4
输出样例1
5
输入样例2
7
14 14 2 13 56 2 37
输出样例2
2354
方法一:因为数据范围不大,故可以遍历每个位置求最小耗能
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
int n,mi=1e9;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
for(int i=a[0];i<=a[n-1];i++)
{
int sum=0;
for(int j=0;j<n;j++)
{
sum+=(a[j]-i)*(a[j]-i);
}
mi=min(sum,mi);
}
cout<<mi;
return 0;
}
法二:通过数学方法计算出最优位置是n个位置的平均值,如果求平均值时除不尽,就再算平均值+1的位置的结果,取min。
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
int n,sum=0,res1=0,res2=0,k=1;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
int x,y;
x=sum/n;
y=sum%n;
for(int i=1;i<=n;i++)
{
res1+=(a[i]-x)*(a[i]-x);
}
if(y!=0)
{
x=x+1;
for(int i=1;i<=n;i++)
{
res2+=(a[i]-x)*(a[i]-x);
}
res1=min(res1,res2);
}
cout<<res1;
return 0;
}