bzoj 1724 优先队列 切割木板

倒着的石子合并,注意不是取当前最长木板贪心做,而是取当前最小累加答案;

例如 4 5 6 7 

若按第一种思路:ans=22+15+9

第二种:ans=22+13+9,可以先从中间某一块分开,这样答案更优

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define ll long long
using namespace std;
const int maxn=20050;
inline int read(){
    char ch=getchar(); int f=1,x=0;
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return f*x;}
int n;ll ans;
struct node{
    ll v;bool operator<(const node &b)const
    {return v>b.v;}};priority_queue<node>q;
int main(){
    n=read();
    rep(i,1,n){int x=read(); q.push((node){x});}
    rep(i,1,n-1){
        ll x=q.top().v;q.pop();
        ll y=q.top().v;q.pop();
        q.push((node){x+y});ans+=x+y;}
    printf("%lld",ans); return 0;
}

 

转载于:https://www.cnblogs.com/asdic/p/9579411.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值