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;
}

posted @ 2022-02-14 08:16  dctwan  阅读(17)  评论(0编辑  收藏  举报