zoukankan      html  css  js  c++  java
  • 55-围栏修复--PriorityQueue java优先队列的应用

              围栏修复

    描述

    农夫约翰想修修牧场周围的一小部分篱笆。他测量围栏并认定他需要Ñ(1≤ Ñ ≤20000)厚木板,每一个都具有一些整数长度大号(1≤ 大号 ≤50000)单元。然后,他购买了一块足够长的单板长板,以便看到N板(即长度为长度i的总和)。FJ忽略了“切口”,当切割锯切时,木屑损失了额外的长度; 你也应该忽略它。

    FJ遗憾地意识到他没有用锯切割木头的锯子,所以他用这个长板子偷偷地去农民唐的农场,礼貌地问他是否可以借锯。

    壁橱资本家Farmer Don并没有给FJ借一块锯,而是向农民John提供了每块N -1切割的费用。切割一块木头的费用与其长度完全相同。切割长度为21的木板需要21美分。

    农民唐然后让农夫约翰决定切割木板的顺序和位置。帮助Farmer John确定他可以用来创建N个木板的最低金额。FJ知道他可以以各种不同的顺序切割板,这将导致不同的费用,因为所得到的中间板具有不同的长度。

    输入

    第1行:一个整数N,木板的数量 
    第2行.N +1:每行包含一个描述所需木板长度的整数

    产量

    第1行:一个整数:他必须花费N -1削减的最低金额

    样本输入

    3
    8
    5
    8

    样本输出

    34

    暗示

    他希望将长度为21的板切成8,5和8的长度。 
    原板的尺寸为8 + 5 + 8 = 21。第一次切割将花费21,并且应该用于将板切割成13和8的碎片。第二次切割将花费13,并且应该用于将13切割成8和5.这将花费21 + 13 = 34 。如果将21切割成16和5,则第二次切割将花费16,总共37(超过34)。
     
    思路:贪心+优先队列: 每次去最小的合并,合并的即为要切的长度,所以每次取最小的两个,然后弹出,并加和放入优先队列。
    java中的优先队列: PriorityQueue
    code:
    package lq2018_gs;
    
    import java.util.PriorityQueue;
    import java.util.Queue;
    import java.util.Scanner;
    
    public class test {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Queue<Integer> que = new PriorityQueue<Integer>();
    		System.out.println(que.toString());
    		que.add(20);
    		que.add(10);
    		que.add(-2);
    		que.add(100);
    		System.out.println(que.toString());
    		while(!que.isEmpty()) {
    			int x = que.peek();
    			que.poll();
    			System.out.println("x: " + x);
    		}
    	}
    
    }
    

      

    本题代码:注意要改为 Main 并去掉报名,否则包error time

    package lan_qiao;
    
    import java.util.PriorityQueue;
    import java.util.Queue;
    import java.util.Scanner;
    
    public class t1 {
    	public static Queue<Integer> que = new PriorityQueue<Integer>();
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner cin = new Scanner(System.in);
    		
    		
    		int n = cin.nextInt();
    		for(int i = 0; i < n; i++) {
    			que.add(cin.nextInt());
    		}
    		long ans = 0;
    		while(que.size() > 1) {
    			int x = que.poll();
    			int y = que.poll();
    			ans += x + y;
    			que.add(x + y);
    		}
    		System.out.println(ans);
    		cin.close();
    	}
    
    }
    

      

  • 相关阅读:
    Python 爬虫简介
    Python 线程池(小节)
    Python platform 模块
    Python term 模块
    python 统计使用技巧
    ArcGIS中的WKID(转)
    c#二维码资料
    How to remove live visual tree?
    新书预告 ArcGIS跨平台开发系列第一本
    visual studio 中删除多余的空白行
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/10878063.html
Copyright © 2011-2022 走看看