算法题每日一练---第30天:部落谈判

简介: 有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。

一、问题描述


在很久很久以前,有 n 个部落居住在平原上,依次编号为 1 到 n。第 i个部落的人数为 ti。


有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。


每次谈判,小蓝只能邀请两个部落参加,花费的金币数量为两个部落的人数之和,谈判的效果是两个部落联合成一个部落(人数为原来两个部落的人数之和)。


二、题目要求


输入描述

输入的第一行包含一个整数 n,表示部落的数量。

第二行包含 n 个正整数,依次表示每个部落的人数。

其中,1≤n≤1000,1≤ti≤10^4。


输出描述

输出一个整数,表示最小花费。


测试数据

输入4个数字分别为9 1 3 5,输出结果为31


运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M


三、问题分析


这是一道考察贪心最优解的问题,题目要求将n个部落聚合到一起,使之花费最少,那我们每一次谈判都邀请人数最少的两个部落不就行了。

以测试数据为例,先进行一次排序:135913合在一起变成4,4重新加入后排序45945合在一起变成9,重新加入后排序99最后,所有结果相加:4+9+9+9=31

排序可以使用C++中的排序函数,不需要自己编写,那两个数字相加重新加入的数字怎么办?

第一步1 3合并成4,我们可以让4赋值给3,1变成0,那么数组的大小没变,排序也不受影响。

13合在一起变成4,4重新加入后排序045945合在一起变成9,重新加入后排序0099最后,所有结果相加:4+9+9+9=31

拓展

C++头文件algorithm中的sort函数:

以数组为例a[4]={3,4,1,2} , sort(a,a+4) 输 出 1 2 3 4


四、编码实现


#include<iostream>#include<algorithm>usingnamespacestd;
longlonginta[10008],sum=0;//初始化定义,应该不会超范围intmain()
{
inti,n;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);//初始化排序for(i=0;i<n-1;i++)
    {
intmin=a[i]+a[i+1];//定义min存储数组内最小的两个元素a[i]=0;
a[i+1]=min;//第二个元素为minsum+=min;
sort(a,a+n);
    }
cout<<sum;//输出结果return0;
}


相关文章
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
66 0
|
算法
算法题每日一练---第78天:二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target
192 1
算法题每日一练---第78天:二分查找
|
存储 算法
|
算法
算法题每日一练---第76天:丑数 l
丑数 就是只包含质因数 2、3 和 5 的正整数。
150 1
算法题每日一练---第76天:丑数 l
|
算法
算法题每日一练---第75天:Nim 游戏
你和你的朋友,两个人一起玩 Nim 游戏。
327 0
算法题每日一练---第75天:Nim 游戏
|
算法
算法题每日一练---第74天:快乐数
编写一个算法来判断一个数 n 是不是快乐数。
180 0
算法题每日一练---第74天:快乐数
|
存储 算法
算法题每日一练---第73天:加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
162 0
算法题每日一练---第73天:加一
|
算法
算法题每日一练---第72天:数字 1 的个数
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
228 0
算法题每日一练---第72天:数字 1 的个数
|
存储 算法
算法题每日一练---第71天:回文数
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
158 0
算法题每日一练---第71天:回文数