输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出权值。
5 1 2 2 5 9
37
import java.util.Scanner;
import java.util.PriorityQueue;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int n = in.nextInt();
PriorityQueue<Integer> q = new PriorityQueue<Integer>();
for(int i=0;i<n;i++)
q.add(in.nextInt());
int ans = 0;
while(q.size()>1){
int first = q.poll();
int sec = q.poll();
ans += (first + sec);
q.add(first+sec);
}
System.out.println(ans);
}
}
}
#include<iostream>
#include<limits.h>
using namespace std;
typedef struct HuffmanNode{
long int weight;
int parent;
int lchild;
int rchild;
}HuffmanNode,*HuffmanTree;
void select(int& s1,int& s2,HuffmanTree T, int n);
int main()
{
int n;
HuffmanTree Tree;
while(cin>>n)
{
int m=2*n-1;
Tree=(HuffmanTree)malloc(sizeof(HuffmanNode)*(m+1));
int i;
for(i=1;i<=n;i++)
{
int weight;
cin>>weight;
Tree[i].weight=weight;
Tree[i].parent=0;
Tree[i].lchild=0;
Tree[i].rchild=0;
}
for(;i<=m;i++)
{
Tree[i].weight=0;
Tree[i].lchild=0;
Tree[i].rchild=0;
Tree[i].parent=0;
}
for(i=n+1;i<=m;i++)
{
int s1,s2;
select(s1,s2,Tree,i-1);
Tree[i].lchild=s1;
Tree[i].rchild=s2;
Tree[s1].parent=i;
Tree[s2].parent=i;
Tree[i].weight=Tree[s1].weight+Tree[s2].weight;
}
long int sum=0;
for(i=1;i<=n;i++)
{
int p,f,j=0;
for(p=i,f=Tree[p].parent;f!=0;p=f,f=Tree[p].parent)
{
j++;
}
sum=sum+(Tree[i].weight*j);
}
cout<<sum<<endl;
free(Tree);
}
return 0;
}
void select(int& s1,int& s2,HuffmanTree T,int n)
{
int i;
long int min=LONG_MAX,secMin=LONG_MAX;
for(i=1;i<=n;i++)
{
if(T[i].parent==0)
{
if(T[i].weight<=min)
{
s2=s1;
secMin=min;
s1=i;
min=T[i].weight;
}
else if(T[i].weight<=secMin)
{
s2=i;
secMin=T[i].weight;
}
}
}
}
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n, sum, temp;
vector<int> s;
while(cin >> n)
{
sum = 0;
for(int i = 0; i!= n; ++i)
{
cin >> temp;
s.push_back(temp);
}
int bg = 0, ed = n;
while(ed-bg != 1)
{
sort(&s[bg], &s[ed]);
temp = s[bg++] + s[bg++];
sum += temp;
s.push_back(temp);
ed++;
}
cout << sum << endl;
s.clear();
}
} #include<stdio.h>
int a[1000],n;
int min(int a[])//找最小的数
{
int min=a[0],minindex=0,i;
for(i=1;i<n;i++)
if(a[i]<min)
{
min=a[i];
minindex=i;
}
a[minindex]=a[n-1];
n--;//把最后一个数放在最小位置,然后长度减一
return min;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int ans=0,min1,min2;
while(n>1)//剩下的大于俩结点
{
min1=min(a);//两个结点
min2=min(a);
ans+=min1+min2;//结果
a[n]=min1+min2;//新增的结点
n++;
}
printf("%d\n",ans);
} #include <stdio.h>
int a[1001];
int next(int i) {
int min=2*i;
if(2*i+1<=a[0] && a[2*i+1]<a[2*i])
min=2*i+1;
if(a[min]<a[i]) {
int t=a[i];
a[i]=a[min];
a[min]=t;
return min;
}
return a[0]/2+1;
}
void down(int i) {
while(i<=a[0]/2)
i=next(i);
}
//小顶堆的初始化
void init() {
for(int i=a[0]/2; i>=1; i--)
down(i);
}
//取出数组中最小的两个数,相加得s,将s加入数组,返回s
int sum() {
int s=a[1];
a[1]=a[a[0]];
a[0]--;
down(1);
s+=a[1];
a[1]=s;
down(1);
return s;
}
int main() {
while(scanf("%d",&a[0])!=EOF) {
for(int i=1; i<=a[0]; i++)
scanf("%d",&a[i]);
init();
int ans=0;
while(a[0]>1)
ans+=sum();
printf("%d\n",ans);
}
return 0;
} #include<iostream>
#include <iostream>
#include <queue>
using namespace std;
struct cmp {
bool operator() (const int & a, const int & b) {
return a > b;
}
};
int main() {
//freopen("t.txt", "r", stdin);
int n;
while(cin>>n) {
priority_queue<int, vector<int>, cmp> pq;
for(int i = 0; i<n; i++) {
int t;
cin>>t;
pq.push(t);
}
int res = 0;
while(pq.size() > 1) {
int a = pq.top(); pq.pop();
int b = pq.top(); pq.pop();
int c = a + b;
res += c;
pq.push(c);
}
cout<<res<<endl;
}
}
#include<iostream>
#include<queue>
using namespace std;
int main(){
int n,temp,a,b;
int weight;
priority_queue<int,vector<int>,greater<int>> minheap;
while(cin>>n)
{
weight = 0;
for(int i= 0;i < n;i++)
{
cin>>temp;
minheap.push(temp);
}
while(minheap.size()!= 1)
{
a = minheap.top();
minheap.pop();
b = minheap.top();
minheap.pop();
weight = weight + a +b;
minheap.push(a+b);
}
cout<<weight<<endl;
minheap.pop();
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int number[1000];
int n,result;
while (cin >> n) {
result = 0;
for (int i = 0; i < n; i++)cin >> number[i];
for (int i = 0; i < n-1; i++) {
sort(number+i, number + n);
number[i + 1] = number[i] + number[i + 1];
result += number[i + 1];
}
cout << result << endl;
}
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,arr[1000];
while(cin>>n)
{
for(int i=0;i<n;++i)
cin>>arr[i];
int answer=0,i=0;
while(i!=n-1)
{
sort(arr,arr+n);
arr[i+1]=arr[i]+arr[i+1];
answer+=arr[i+1];
++i;
}
cout<<answer<<endl;
}
return 0;
} import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
PriorityQueue<Integer> queue = new PriorityQueue<>();
for (int i = 0; i < n; i++) queue.add(scanner.nextInt());
int weight=0;
while (queue.size()!=1){
Integer a = queue.poll();
Integer b = queue.poll();
weight+=a+b;
queue.add(a+b);
}
System.out.println(weight);
}
} import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt(), sum = 0;
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
for(int i = 0; i < n - 1; i++) {
Arrays.sort(nums, i, n);
nums[i + 1] = nums[i] +nums[i + 1];
nums[i] = 0;
sum += nums[i + 1];
}
System.out.println(sum);
}
}
} #include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef struct HuffmanTree{
int data;
int weight;
HuffmanTree *lchild,*rchild;
} HT;
int n;
vector<HT> seq;
bool cmp(HT a,HT b){
return a.data<b.data;
}
void insert_node(HT* node){
if(seq.empty()){
seq.push_back(*node);
return;
}
vector<HT>::iterator it = seq.begin();
for(it;it != seq.end();it++){
if(node->data <= it->data){
seq.insert(it,*node);
return;
}
}
seq.push_back(*node);
}
HT* buildHT(){
while(1){
HT *fnode = (HT*) malloc(sizeof(HT));
HT *node_l = (HT*) malloc(sizeof(HT));
HT *node_r = (HT*) malloc(sizeof(HT));
*node_l = seq[0];
*node_r = seq[1];
fnode->data = node_l->data + node_r->data;
fnode->lchild = node_l;
fnode->rchild = node_r;
seq.erase(seq.begin());
seq.erase(seq.begin());
insert_node(fnode);
if(seq.size() == 1){
return fnode;
}
}
}
void cal_weight(int &ans,HT* node,int level){
if(node == NULL) return;
if(node->lchild == NULL && node->rchild == NULL){
ans = ans + node->data * level;
return;
}
cal_weight(ans,node->lchild,level+1);
cal_weight(ans,node->rchild,level+1);
}
int main(){
int ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
HT *node = (HT*) malloc(sizeof(HT));
scanf("%d",&node->data);
node->lchild = NULL;
node->rchild = NULL;
seq.push_back(*node);
}
sort(seq.begin(),seq.end(),cmp);
HT* root = buildHT();
cal_weight(ans,root,0);
printf("%d",ans);
return 0;
}
import java.util.PriorityQueue;
import java.util.Scanner;
/**
* Created by fhqplzj on 17-2-19 at 下午8:03.
*/
public class Huff {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(n);
for (int i = 0; i < n; i++) {
priorityQueue.add(scanner.nextInt());
}
int result = 0;
while (priorityQueue.size() > 1) {
int a = priorityQueue.poll();
int b = priorityQueue.poll();
result += a + b;
priorityQueue.add(a + b);
}
System.out.println(result);
}
}
}
优先队列
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
// 求哈夫曼树的带权路径和
int main() {
priority_queue<int> pqueue;// 存入相反数(模拟出一个小根堆)
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
int leaf;
scanf("%d", &leaf);
pqueue.push(-leaf);// 模拟小根堆
}
int res = 0;// 存储带权路径和的中间结果
while (pqueue.size() > 1) {
// 取出最小的两个元素
int leaf1 = pqueue.top();
pqueue.pop();
int leaf2 = pqueue.top();
pqueue.pop();
// 计算带权路径和
res = res + leaf1 + leaf2;
// 把构成的新子树插入回原来的集合 K中
pqueue.push(leaf1 + leaf2);
}
printf("%d\n", -res);
}
return 0;
} #include <iostream>
#include <queue>
using namespace std;
int main()
{
int n,ans,i;
priority_queue<int, vector<int>, greater<int>> tmp;
cin>>n;
for(i=0;i<n;++i)
{
cin>>ans;
tmp.push(ans);
}
int sum=0;
while(tmp.size()>1)
{
int min1,min2;
min1=tmp.top();
tmp.pop();
min2=tmp.top();
tmp.pop();
sum+=min1+min2;
tmp.push(min1+min2);
}
cout<<sum<<endl;
return 0;
}