poj3253:Fence Repair
题目描述
给定一块木板,求分割成n块木板所需要的最小代价,其中分割一块木板所需要的代价为木板长度
分析
贪心策略
可将分割木板问题理解为组合木板问题,给定n块木板长度,将其合并成一块木板所需要的最小代价。可将此问题分解成若干子问题,每次选取两块木板合并,而子问题的最优解为每次选取最小的两块木板组合,代价最小。再将子问题最优解组合即为原问题最优解。
可以使用priority_queue方便的实现
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
//priority_queue默认为大根堆,需定义小根堆
priority_queue<int, vector<int>, greater<int> > q;
int main(){
int n, wood;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &wood);
q.push(wood);
}
long long answer = 0;
while(!q.empty()){
int w1 = q.top(); //最短的木板
q.pop();
if(q.empty()){
break;
}
int w2 = q.top(); //次短的木板
q.pop();
int t = w1 + w2;
answer += t;
q.push(t); //将组合成的新木板放入小根堆
}
printf("%lld\n", answer);
return 0;
}