题目描述
有多个视频需要合并为一个视频,假设一次只能将两个视频进行合并,合并需要的时间为该两个视频的时间之和。请计算将多个视频合并为一个视频需要的最小时间为多少?
输入格式
输入的第一行包含一个正整数n,表示共有n个视频需要合并。其中n不超过100。 第二行中有n个用空格隔开的正整数,分别表示n个视频的时间。
输出格式
输出包括一个正整数,即合并需要的最小时间。
输入样例 复制
8
5 29 7 8 14 23 3 11
输出样例 复制
271
代码(改进出了针对江志英老师的阴间测试数据的版本)
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct HuffmanNode
{
int weight;
int parent, lchild, rchild;
};
bool operator<(const HuffmanNode &node1, const HuffmanNode &node2)
{
return node1.weight < node2.weight;
}
struct HuffmanTree
{
HuffmanNode *nodes;
int LeafNumber;
};
int CreateHuffmanTree(HuffmanTree &T, int LeafNumber, int *weight)
{
T.nodes = new HuffmanNode[LeafNumber * 2 - 1]; //
T.LeafNumber = LeafNumber;
for (int i = 0; i < LeafNumber; i++)
{
T.nodes[i].weight = weight[i];
T.nodes[i].parent = T.nodes[i].lchild = T.nodes[i].rchild = -1;
}
sort(T.nodes, T.nodes + LeafNumber);
int s = 0, t = LeafNumber;
for (int i = 0; i < LeafNumber - 1; i++)
{
int k1;
if (s < LeafNumber && (t >= LeafNumber + i || T.nodes[s].weight < T.nodes[t].weight))
k1 = s++;
else
k1 = t++;
int k2;
if (s < LeafNumber && (t >= LeafNumber + i || T.nodes[s].weight < T.nodes[t].weight))
k2 = s++;
else
k2 = t++;
T.nodes[i + LeafNumber].weight = T.nodes[k1].weight + T.nodes[k2].weight;
T.nodes[i + LeafNumber].parent = -1;
T.nodes[i + LeafNumber].lchild = k1;
T.nodes[i + LeafNumber].rchild = k2;
T.nodes[k1].parent = i + LeafNumber;
T.nodes[k2].parent = i + LeafNumber;
}
return 0;
}
int main()
{
int n;
cin >> n;
int weight[110];
for (int i = 0; i < n; i++)
{
cin >> weight[i];
}
HuffmanTree T;
CreateHuffmanTree(T, n, weight);
int sum = 0;
for (int i = 0; i <2 * n - 2; i++)
{
sum += T.nodes[i].weight;
}
if(n==1)
{
cout<<weight[0]<<endl;
}
else
{
cout << sum << endl;
}
return 0;
}