• Java实现 蓝桥杯VIP 算法提高 最小乘积(提高型)


    算法提高 最小乘积(提高型)
    时间限制:1.0s 内存限制:512.0MB
    问题描述
      给两组数,各n个。
      请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。要求程序输出这个最小值。
      例如两组数分别为:1 3  -5和-2 4 1

    那么对应乘积取和的最小值应为:
      (-5) * 4 + 3 * (-2) + 1 * 1 = -25
    输入格式
      第一个行一个数T表示数据组数。后面每组数据,先读入一个n,接下来两行每行n个数,每个数的绝对值小于等于1000。
      n<=1000,T<=10
    输出格式
      一个数表示答案。
    样例输入
    2
    3
    1 3 -5
    -2 4 1
    5
    1 2 3 4 5
    1 0 1 0 1

    样例输出

    -25
    6

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.StreamTokenizer;
    import java.util.LinkedList;
    import java.util.PriorityQueue;
    
    
    public class 最小乘积提高型 {
    	private static int n;
    	private static PriorityQueue<Integer> one = new PriorityQueue<Integer>();
    	private static PriorityQueue<Integer> two = new PriorityQueue<Integer>();
    
    	public static void main(String[] args) throws IOException {
    
    		StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    		st.nextToken();
    		int t = (int) st.nval;
    		while (t-- > 0) {
    			st.nextToken();
    			n = (int) st.nval;
    			one.clear();
    			two.clear();
    			for (int i = 0; i < n; i++) {
    				st.nextToken();
    				one.add((int) st.nval);
    			}
    			for (int i = 0; i < n; i++) {
    				st.nextToken();
    				two.add((int) st.nval);
    			}
    
    			LinkedList<Integer> onelist = new LinkedList<Integer>();
    			LinkedList<Integer> twolist = new LinkedList<Integer>();
    
    			while (!one.isEmpty()) {
    				onelist.add(one.poll());
    				twolist.add(two.poll());
    			}
    
    			int maxo, mino, maxt, mint, result = 0;
    			while (!onelist.isEmpty()) {
    				maxo = onelist.getLast();
    				mint = twolist.getFirst();
    				mino = onelist.getFirst();
    				maxt = twolist.getLast();
    
    				if (maxo * mint < mino * maxt) {
    					result += (maxo * mint);
    					onelist.removeLast();
    					twolist.removeFirst();
    				} else {
    					result += (maxt * mino);
    					onelist.removeFirst();
    					twolist.removeLast();
    				}
    			}
    			System.out.println(result);
    		}
    	}
    
    }
    
    
  • 相关阅读:
    vue.js 第二课
    vue.js学习(第一课)
    2016-11-14看张大神的微博总结
    这几天的工作总结:
    调了一天的兼容总结下
    鸭式辩论
    prototype 原型
    前端ps常用的小技巧
    Android的开始之相对布局
    Android的开始之线性布局
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12948285.html
Copyright © 2020-2023  润新知