您的位置:首页 > 编程语言 > Java开发

蓝桥杯-最小乘积-贪心-java

2017-04-17 15:36 288 查看
问题描述  给两组数,各n个。
  请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。要求程序输出这个最小值。
  例如两组数分别为:1 3  -5和-2 4 1

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

样例输出-25
6

解题思路:正常来说这个小题不至于写博客但是这道小题一种解题方法跟一种有趣的贪心策略有关

杭电里有一道田忌赛马正是应用的这种贪心策略只不过比这道题考虑的因素多一些

所以我想在博客记录下来 闲话少叙以下正文

贪心策略:将两个数组排好序 比较第一个数组的头元素和第二个数组的尾元素的乘积和第二个数组的头元素和第一个数组                                                               的尾元素的乘积 他俩谁小 然后移动指针重复上面的判断

import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
// TODO 自动生成的方法存根
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
        	int m = scanner.nextInt();
for (int i = 0; i < m; i++) {
int n = scanner.nextInt();
int [] shu = new int
;
int [] arr = new int
;
for (int j = 0; j < arr.length; j++) {
shu[j] = scanner.nextInt();
}
for (int j = 0; j < arr.length; j++) {
arr[j] = scanner.nextInt();
}
Arrays.sort(shu);Arrays.sort(arr);
int a = 0;int b = n-1;
int c = 0;int d = n-1;
int sum = 0;
while (a<=b&&c<=d) {
int q = shu[a]*arr[d];
int w = arr[c]*shu[b];
if (q<w) {
sum += q;
a+=1;d-=1;
}else {
sum += w;
c+=1;b-=1;
}
}
System.out.println(sum);
}

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 蓝桥杯 贪心