1270 药不能停(合并果子,优先队列,堆)

本文介绍了一种通过贪心算法和优先队列实现的药物合成最小毒性求解方法。问题背景为将多种药物混合以获得最低总毒性。采用堆结构进行高效处理,确保每次选取毒性最小的两种药物进行混合。

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

Description

小明发现单吃一种药效果太差,他要将已有的N种药物混合成1种药再吃。已知每种药都有一定的毒性,将任意两种药混合的毒性为这两种药的毒性之和,混合产生的新药的毒性也同样为两种药的毒性之和。由于技术限制,小明每次只能挑选两种药进行混合。现在小明想知道将N种药合成1种药的最小毒性和。

Input

输入第一行为一个正整数N(1 <= N <= 100000) 
接下来一行输入N个正整数,第i个整数a[i]代表第i种药的毒性( 1 <= a[i] <= 1000)

Output

输出一行一个整数,代表药的最小毒性和。

Sample Input

5
1 2 3 4 5

Sample Output

33

这题属于合并果子里的经典问题,思路是贪心,堆(优先队列)。

建堆O(n) (T(n)=T(n/2)+O(n))  插入,删除操作O(logn).

不懂记得按关键词来百度学习~

#include <iostream>
#include <queue>

using namespace std;

priority_queue <int, vector<int>, greater<int> >q;
int main(void) {
	int n, t, c1, c2, ans = 0;
	cin >> n;
	while(n--)  q.push((cin >> t, t));	
	while(q.size() != 1) {
		 c1 = q.top(), q.pop();
		 c2 = q.top(), q.pop();
		ans += (c1 + c2);
		q.push(c1 + c2);
	}
	cout << ans << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值