总和:(a + b)+ (c + d) +(a + b + c + d ) + e + f + a +b + c + d + e + f
优化:直接计算当前根节点到根节点距离
3a(到根节点的距离) + 3b + 3c + 3d + 2e + 2f
(2)算法步骤
方法: 每次选出最小的两堆进行合并,寻找局部最优解的过程
数最小的两个点,在树中一定是深度最深的,可以互为兄弟(不一定非得是兄弟节点)
数最小,但并未在最深的一层,则需要交换,这样将使整体权值变小(2f + 3b + -(3f + 2b) = b - f > 0)
(3)状态转移
3、题解
importjava.util.*;importjava.io.*;publicclassMain{publicstaticvoidmain(String[] args)throwsIOException{BufferedReader in =newBufferedReader(newInputStreamReader(System.in));Queue<Integer> heap =newPriorityQueue<>();String str1 = in.readLine();int n =Integer.parseInt(str1);String[] str2 = in.readLine().split(" ");for(int i =0; i < n; i++){int x =Integer.parseInt(str2[i]);heap.add(x);}int res =0;while(heap.size()>1){int a = heap.poll();// 选最小的两个点int b = heap.poll();res += a + b;// 合并代价更新heap.add(a + b);// a + b变成了新的节点}System.out.println(res);}}
二、排序不等式
排队问题 + 排队代价,如何让总体代价最小
贪心思想:
让代价越大的排序越靠后
1、题目内容——排队打水
2、算法思路
(1)分析
(2)思路
按照从小到大的顺序排队,总时间最小
(3)证明
3、题解
importjava.util.*;importjava.io.*;publicclassMain{staticintN=100010;staticint[] time =newint[N];publicstaticvoidmain(String[] args)throwsIOException{BufferedReader in =newBufferedReader(newInputStreamReader(System.in));String str1 = in.readLine();int n =Integer.parseInt(str1);String[] str2 = in.readLine().split(" ");for(int i =0; i < n; i++){time[i]=Integer.parseInt(str2[i]);}Arrays.sort(time,0, n);long res =0;for(int i =0; i < n; i++){res += time[i]*(n - i -1);}System.out.println(res);}}
字体图标
Bootstrap 使用的字体图标是来自 Glyphicions Halflings 提供的。在使用的时候,需要遵守以下几点规则:
图标使用的 class 不能与其他组件的 class 混合使用。换言之,图标的 class 必须被定义在 span 元素上。图标使用的 class 具有…