POJ 3253 Fence Repair(优先队列)

来源:互联网 发布:微信外卖系统源码下载 编辑:程序博客网 时间:2024/05/16 16:02

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;}
0 0
原创粉丝点击