【C++】两个和尚抬水吃/搬水果(贪心)

题目描述

在一个寺庙里老和尚要求弟子给厨房抬水,假定所有的水已经分好装在不同大小的桶里,现要求最终把所有的水装到一个大桶中:小和尚很懒,无论桶里有多少水,总要二人抬;但是,小和尚也很聪明,每一次总是可以找到合适的二桶水,把其中一只倒进另—只桶里,他们消耗的体力等于二个水桶的重量之和。
你的任务是帮助二个小和尚设计出合装的次序方案,使得耗费的体力最少,并输出这个最小的体力耗费值。

输入输出形式

输入

第—行是—个整数n (1 <= n <= 30000),表示装有水的水桶的个数。
第二行包含n个整数,用空格分隔,第i个整数ai (1 <= ai <= 20000)是第i个水桶中水的重量。

输出

输出文件包括—行,一个整数,最小的体力耗费值。输入数据保证这个值小于231。

输入输出样例

样例输入1
3
1 2 9

样例输出1
15

样例输入2
10
3 5 1 7 6 4 2 5 4 1

样例输出2
120

思路 

贪心思想,每次将最小的两堆果子合并,直到最后只剩一堆果子
【正确性证明】:果子的合并可以看成树节点的合并如下图

代码

#include <bits/stdc++.h>
#include <vector>
#include <map>
#include <stack>
#define ll long long 
using namespace std;
const int N = 110; 

int main()
{
    int n,x;
    while(~scanf("%d",&n)&&n) {
        priority_queue<int,vector<int>,greater<int> >ansa;
        for(int i=1; i<=n; ++i)  { cin >> x;  ansa.push(x); }
        int ans=0;
        while(ansa.size()>1) {
            int a = ansa.top();  ansa.pop();
            int b = ansa.top();  ansa.pop();
            ans += (a+b);  ansa.push(a+b);
        }
        cout << ans << endl;
    }
    return 0;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米莱虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值