Advertisement

数据结构课设 修理牧场 (哈夫曼树基础)

阅读量:

5-13 修理牧场 (25分)

农夫首先量度了栅栏的长度,并经计算得出总共需要N块木头,每块长度为整数L_i个单位。为了满足需求并精确地满足每个部分的需求, 他决定购买一条足够长且可分割成N段的具体木料

然而农夫自身并无一把锯子,若请他人切割木材,则酬劳按所切割木料的长度计价.为了简便起见,不妨就设酬金等于所切木头的长度.举个例子来说,将一根长度为20的木材切成长度分别为8、7和5的三段,第一次切割花费了20单位,将其分割为12和8两部分;第二次切割耗费了12单位,将其分割为7和5两部分.这样总共花费了32单位.如果第一次将木材分割为15和5两部分,则第二次切割需耗费15单位,总费用则增加到35单位(高于之前的32单位).

请编写程序帮助农夫计算将木头锯成N块的最少花费。

输入格式:

接着, 输入提供一个正整数 N (≤10^4), 即表示需要将木头分割成 N 块. 随后, 输入提供 N 个不超过 50 的正整数, 这些数字代表每段木头的长度.

输出格式:

输出一个整数,即将木头锯成N块的最少花费。

输入样例:

复制代码
 8

    
 4 5 1 2 1 3 1 1

输出样例:

复制代码
    49

和poj3253差不多,只不过数据弱了很多,排个序用vector就可以过。

复制代码
 #include <iostream>

    
 #include <cstring>
    
 #include <cstdio>
    
 #include <vector>
    
 #include <algorithm>
    
 using namespace std;
    
 int main() {
    
     vector <int> v;
    
     int n;
    
     scanf("%d", &n);
    
     int i;
    
     int x;
    
     for(i = 0; i < n; i++) {
    
     	scanf("%d", &x);
    
     	v.push_back(x);
    
 	}
    
 	sort(v.begin(), v.end());
    
 	vector <int>::iterator it;
    
 	int sum = 0;
    
 	int ans = 0;
    
 	while(v.size() > 1) {
    
 		sum = v[0] + v[1];
    
 		ans += sum;
    
 		v.erase(v.begin());
    
 		v.erase(v.begin());
    
 		if(!v.empty()) {
    
 			int flag = 0;
    
 			for(i = 0; i < v.size(); i++) {
    
 				if(v[i] >= sum) {
    
 					v.insert(v.begin() + i, sum);
    
 					flag = 1;
    
 					break;
    
 				}
    
 			}
    
 			if(flag == 0) v.push_back(sum);
    
 		}
    
 	}
    
 	printf("%d\n", ans);
    
 	
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~