输入有多组数据。 每组第一行输入一个数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;
}
#include <iostream> #include <queue> using namespace std; int main() { int n; while (cin >> n) { int sum = 0; priority_queue<int> minheap; while (n--) { int i; cin >> i; minheap.push(-i); } while (1) { int a = minheap.top(); minheap.pop(); int b = minheap.top(); minheap.pop(); sum += a+b; if (minheap.empty()) break; minheap.push(a+b); } cout << -sum << endl; } return 0; }