POJ 3253 Fence Repair(优先队列)

Description
有一块长木板,要经过n-1次切割将其切成n块农夫想要的木板,对于每块木板,没切割一次,将会消耗和这条木板长度值相等的金钱,问最少需要多少钱,可将木板切成自己想要的n块
Input
第一行为一个整数n表示农夫想要的木板数,之后n行每行一个整数表示需要的木板长
Output
输出最少花钱数
Sample Input
3
8
5
8
Sample Output
34
Solution
优先队列
Code

#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
using namespace std; 
typedef long long ll;
struct cmp
{
    bool operator()(const ll x,const ll y)
    {
        return x>y;
    }
};
int main()
{
    priority_queue<ll,vector<ll>,cmp> que;
    int n;
    ll num;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lld",&num);
        que.push(num);//将需要的木板长度入队 
    }
    ll ans=0;
    while(que.size()>1)//当队列中小于等于一个元素时跳出 
    {
        ll a=que.top();//得到队首元素的值,并使其出队 
        que.pop();
        ll b=que.top();//两次取队首,即得到最小的两个值
        que.pop();
        que.push(a+b);//入队
        ans+=(a+b);
    }
    printf("%lld\n",ans);
    return 0;
}

你可能感兴趣的:(POJ 3253 Fence Repair(优先队列))