/*
por3242-Fence Repair
题目大意:给定一个木条,锯成指定要求的长度,每锯一次花费是被锯成的两段长度之和。
求最小的花费。
解题思路:
将小木条合并成一个大木条,贪心。每次都选取最小的长度合并。求最小的时候用优先队列。
*/
#include <cstdio>
#include <queue>
#include <vector>
#include <iostream>
#pragma warning(disable:4996)
using namespace std;
//最小堆的比较函数
struct cmp
{
bool operator()(const int &a, const int &b)
{
return a > b;
}
};
int main()
{
freopen("poj3252.txt", "r", stdin);
int n = 0;
long long sum = 0;
priority_queue<int, vector<int>, cmp> q;
scanf("%d", &n);
int tmp = 0;
while (n--)
{
scanf("%d", &tmp);
q.push(tmp);
}
int a, b;
while (1 != q.size())
{
a = q.top();
q.pop();
b = q.top();
q.pop();
q.push(a + b);
sum += ((long long)a + b);
}
printf("%lld\n", sum);
return 0;
}
poj3253-贪心选择
最新推荐文章于 2019-07-11 14:19:41 发布