【贪心算法】最小能量消耗

Alice和Bob买了个清扫垃圾的机器人,这个机器人能够把两堆垃圾压缩成一堆,但它有个怪癖,两堆垃圾必须放在另外一个干净的地方进行压缩。如果所有的垃圾压缩成一堆了,它完成任务。把一堆垃圾从一个地方运到另一个地方所耗能量等于这堆垃圾的重量,两堆垃圾进行压缩所耗能量是这两堆垃圾重量之和。问,处理已知的垃圾要耗能多少?
输入:垃圾的数目N,以及每堆垃圾的重量Wi
输出:所耗能量之和T
样例输入:
3
3 4 5
样例输出:
38

算法描述:
1. 将所有垃圾按重量由小到大依次排序;
2. 首先选取前两堆的垃圾并且将其从序列中删除,运到干净地方并压缩,此过程中计算出运输及压缩消耗的能量计入count中;
3. 接着将压缩产生的新垃圾的重量加入到序列中并重新排序;
4. 重复此过程,直至所有垃圾压缩成一堆;
5. 最后count值即为所消耗能量T之和。

注:这题的算法思想算是贪心算法中比较经典的,很容易的便可分析出来,由小到大排序,每次选两个最小的。

代码如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
vector<int> weight;

int main() {
	int num;
	int count = 0;
	cin >> num;
	for (int i = 0; i < num; i++) {
		int w;
		cin >> w; 
		weight.push_back(w);
	}
	while(weight.size() >= 2) {
		sort(weight.begin(), weight.end());
		int one_w;
		one_w = weight[0] + weight[1];
		count += (2 * one_w);  //运输加压缩,所以消耗的能量是2倍
		weight.erase(weight.begin(), weight.begin() + 2); //再塞回序列里
		weight.push_back(one_w);
	}
	cout << count;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值