您的位置:首页 > Web前端

POJ 3253 Fence Repair(优先队列)

2015-07-13 09:29 274 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: