猴子搬桃(一)

博客探讨了著名的猴子搬桃问题,通过计算中位数来确定桃子应搬至何处,以达到数量平分。文章提供了解决方案的代码及详细注释,适合对算法和编程感兴趣的读者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述 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
        对于70%的数据,n<=5000
        对于100%的数据, n<=100000,所有仓库桃子数量<=10000

        这题就是一道明显的中位数,把桃子全部搬到等于和一半的位置即可。详见代码及注释。

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

        求赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值