题目描述 Description |
【问题描述】 猴子一共有n个仓库,每个仓库中存放着很多桃子,这n仓库都在一条直线上。相邻两个仓库的距离都是一样的。猴子想把所有的桃子搬到一共仓库中去,搬运桃子需要消耗力气。 搬运x个桃子到相邻的仓库消耗1*x的单位力气。 如果搬到隔一个的仓库中就要消耗2*x的单位力气。隔的越多消耗的力气也相应增加。 猴子希望在搬桃子的时候,消耗的力气最小。例如猴子有3个仓库,依次放着桃子1 3 5,那么都搬到3号仓库比较省力气。从1号仓库中搬1个桃子到3号仓库消耗力气1*2=2。从2号仓库搬3个桃子到3号仓库消耗力气3*1。总的消耗力气2+3=5,很明显,这个是所有搬运方式中消耗的最小力气了。 提示: 第i个仓库到第j个仓库相隔多少个仓库可以用abs(i-j)表示。其中abs表示绝对值 【输入】 第一行一个整数n表示仓库数量 第二行n个整数表示每个仓库的桃子数量 【输出】 一个整数表示猴子把所有桃子搬到一个仓库中需要消耗的最小力气。 |
样例输入 Sample Input | |
4 6 1 2 4 |
样例输出 Sample Output |
16 说明:都搬到2号仓库,消耗6*1+2*1+4*2=16 |
时间限制:所有句子相加不超过1亿句。 1亿就是1秒 空间限制:所有数组相加不超过1000万。 约40M内存 |
对于30%的数据n<=100 |
这题就是一道明显的中位数,把桃子全部搬到等于和一半的位置即可。详见代码及注释。
#include<bits/stdc++.h>
using namespace std;
long long a[200000],n,i,k,s,s1,ans;
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
s=s+a[i];//计算总和
}
for(i=1;i<=n;i++)
{
s1=s1+a[i];
if(s1>=s/2.0)//注意要除以的是2.0,不然就变成整除了。
{
k=i;
break;
}
}
ans=0;//计算搬到目标k的体力总数
for(i=1;i<=n;i++)
ans=ans+abs(k-i)*a[i];
cout<<ans;
}
求赞!