欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 【在数轴上找最优位置,使移动距离最短】

【在数轴上找最优位置,使移动距离最短】

2025/3/20 3:04:34 来源:https://blog.csdn.net/xiworldla/article/details/146351408  浏览:    关键词:【在数轴上找最优位置,使移动距离最短】

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;}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词