Fence Repair POJ - 3253 哈夫曼思想 优先队列

题意:给出一段无限长的棍子,切一刀需要的代价是棍子的总长,例如21切一刀 变成什么长度 都是代价21 列如7切成5 和2 也是代价7
题解:可以利用霍夫曼编码的思想 短的棍子就放在底层 长的尽量切少一次 直接用优先队列 取前2个和一个然后代价加起来就好 有一个
小trick就是 只有一个棍子的时候要特判 还有sum要开Long long 

#include<vector>
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int main(){
    int n;
    while(cin>>n){
    priority_queue<int ,vector<int>,greater<int > >q;
        for(int i=0;i<n;i++){
            int temp;
            scanf("%d",&temp);
            q.push(temp);
        }
    long long  sum=0;
    if(q.size()==1){
        cout<<q.top()<<endl;
        q.pop();
    }
    while(q.size()>1){
        int temp1=q.top();q.pop();
        int temp2=q.top();q.pop();
        sum+=temp1+temp2;
        q.push(temp1+temp2);
    }
    cout<<sum<<endl;
    }
    return 0;
}

 

posted @ 2018-11-21 15:01  tttttttttrx  阅读(92)  评论(0编辑  收藏  举报