zoukankan      html  css  js  c++  java
  • 蓝桥杯软件大赛练习系统——算法训练 最小乘积(基本型)

    ************************************************************************
    * 精品书籍推荐:《算法竞赛入门经典》
    * 该书对于ACMer几乎人手一本,所以在这里倾力推荐,读完这本书,我们就可以开始我们的算法征程了!!!
    * 看完上面那本书,还有一本它的升级版:《算法竞赛入门经典:训练指南》
    * 再读完这本书,你就超神了!!!
    ************************************************************************
    问题描述
      给两组数,各n个。
      请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。要求程序输出这个最小值。
      例如两组数分别为:1 3  -5和-2 4 1

      那么对应乘积取和的最小值应为:
      (-5) * 4 + 3 * (-2) + 1 * 1 = -25
    输入格式
      第一个行一个数T表示数据组数。后面每组数据,先读入一个n,接下来两行每行n个数,每个数的绝对值小于等于1000。
      n<=8,T<=1000
    输出格式
      一个数表示答案。
    样例输入
      1
      3
      1 3 -5
      -2 4 1
    样例输出
      -25
    -------------------------------------------------------------------------------
    算法分析:
      我做这道题的时候,其实也是瞎蒙的。没有严格的证明。就是让第一组最大的数和第二组最小的数相乘,然后加起来。具体算法是:
      ①将第一组数按从大到小正向排序
      ②将第二组数按从小到达逆向排序
      ③将两组数对应下标相同的元素相乘,然后加起来
    代码:
     1 import java.util.Arrays;
     2 import java.util.Comparator;
     3 import java.util.Scanner;
     4 
     5 
     6 public class Main {
     7 
     8     public static void main(String[] args) {
     9         // TODO Auto-generated method stub
    10         Scanner cin = new Scanner(System.in);
    11         int cas_num = cin.nextInt();
    12         for(int cas_idx = 0; cas_idx < cas_num; cas_idx ++) {
    13             int num = cin.nextInt();
    14             Integer[] arr1 = new Integer[num];
    15             Integer[] arr2 = new Integer[num];
    16             for(int i = 0; i < num; i ++) {
    17                 arr1[i] = cin.nextInt();
    18             }
    19             
    20             for(int i = 0; i < num; i ++) {
    21                 arr2[i] = cin.nextInt();
    22             }
    23             Arrays.sort(arr1);
    24             Comparator<Integer> cmp = new MyComparator();
    25             Arrays.sort(arr2, cmp);
    26             Arrays.sort(arr2);
    27             Integer sum = 0;
    28             for(int i = 0; i < num; i ++) {
    29                 sum += (arr1[i] * arr2[num - i - 1]);
    30             }
    31             System.out.println(sum);
    32         }
    33         cin.close();
    34         
    35     }
    36 
    37 }
    38 class MyComparator implements Comparator<Integer>{
    39 
    40     @Override
    41     public int compare(Integer o1, Integer o2) {
    42         // TODO Auto-generated method stub
    43         if(o1.compareTo(o2) < 0) {
    44             return 1;
    45         }else if(o1.compareTo(o2) > 0){
    46             return -1;
    47         }else {
    48             return 0;
    49         }
    50     }
    51 }
    View Code

    Java语言知识:

    该算法中用到了Java的API,Arrays.sort(),具体用法见我另一篇博客Java中Array.sort()的几种用法

  • 相关阅读:
    activiti实战系列之动态表单 formService 自定义变量类型
    js向一个数组中插入元素的几个方法-性能比较
    Mac系统安装和配置tomcat步骤详解
    Spring注解之@validated的使用
    Spring注解之@Lazy注解
    centos命令行系列之升级glibc到
    docker实战系列之docker 端口映射错误解决方法
    centos命令行系列之centos6防火墙的关闭以及开启
    docker实战系列之搭建rabbitmq
    运营型模型
  • 原文地址:https://www.cnblogs.com/IT-sky/p/3749767.html
Copyright © 2011-2022 走看看