stl练习D

这篇博客介绍了一道使用STL和贪心算法解决的实际问题,内容涉及如何通过最小两个数相加的方式进行最优解求解,具体包括题目描述、输入输出格式、示例输入输出以及解题提示。

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

Description

美旸旸最近拿到了去年蓝桥杯的奖金,他开始膨胀了,于是他买了一个50斤的西瓜,决定和全班同学分享,
为了某种不可描述的原因,他决定把西瓜的重量切得不一样,这个西瓜将被分成n块,第i块的大小为a[i],在切西瓜时,
美美旸会消耗体力,在切一块重量为x的西瓜时,他会消耗x的体力,例如他把重量为3的西瓜分成两块,则会消耗3点
体力,美美旸知道最后n块的西瓜重量,但是由于他微积分只考了99分,他不知道怎样切才能使得体力花费最小,聪明
的你能帮帮他吗?

Input

多组组数据
每组数据第一行一个数n,表示西瓜一共被切成n块
第二行n个数,表示n块西瓜的重量

Output

每组数据输出一个数,代表美美旸的最小体力花费

Sample Input

 2
 1 2
 5
 1 2 3 4 5

Sample Output

3
33

 

HINT




贪心算法,原题搬水果,满足每次都是最小两个数相加即是最优解


#include <iostream>
#include<queue>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll> >melon;
int main()
{   int N;
    while(cin>>N)
    {   ll sum=0;
        if(N==0) break;
        while(!melon.empty())
        {
            melon.pop();
        }
        for(int i=0;i<N;i++)
        {
            ll x;
            cin>>x;
            melon.push(x);
        }
        while(melon.size()>1)
        {
            ll a=melon.top();
            melon.pop();
            ll b=melon.top();
            melon.pop();
            sum+=a+b;
            melon.push(a+b);
        }
        cout<<sum<<endl;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值