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;
}

 

posted @ 2018-09-03 16:57  ASDIC减除  阅读(118)  评论(0编辑  收藏  举报