• Java实现 蓝桥杯 算法提高 最大乘积


    算法提高 最大乘积
    时间限制:1.0s 内存限制:512.0MB
    提交此题
    问题描述
      对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
    输入格式
      第一行一个数表示数据组数
      每组输入数据共2行:
      第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
      第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
    输出格式
      每组数据输出1行,为最大的乘积。
    样例输入
    1
    5 5
    1 2 3 4 2
    样例输出
    48

    import java.util.Arrays;
    import java.util.Scanner;
    
    
    public class 最大乘积 {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int k = sc.nextInt();
    		while (k > 0) {
    			int n = sc.nextInt();
    			int m = sc.nextInt();
    			int a[] = new int[n];
    			for (int i = 0; i < n; i++)
    				a[i] = sc.nextInt();
    			Arrays.sort(a);
    			int x = 0, y = n - 1;//x从最左边遍历,y从右向左
    			int t = 0;//判断输入的数是否全为负数
    			int sum = 1;
    			/**若输入的数全为负数,并且只取一个的时候,则取绝对值最小的*/
    			for (int i = 0; i < n; i++)
    				if (a[i] < 0)
    					t++;
    			if (t == n&&m==1)
    				sum = a[n - 1];
    			/**输入的数有正有负且取得数大于1的时候*/
    			else
    				while (x < n - 1 && y > 0 && m > 0) {//x从左向右取,y从右向左取取的数超过输入的总个数时退出循环
    					if (a[x] * a[x + 1] > a[y] * a[y - 1] && m >= 2) {//两个正数的乘积大于两个负数的乘积且取得数大于等于两个
    						sum *= a[x] * a[x + 1];//乘积总和乘上两个正数的值
    						x += 2;
    						m -= 2;
    					} else {
    						sum *= a[y];//否则乘积乘上最大的数
    						y--;
    						m--;
    					}
    				}
    			System.out.println(sum);
    			k--;
    		}
     
    	}
    
    
    }
    
    
  • 相关阅读:
    视图容器组件使用
    组件的学习
    伸展树
    二叉搜索树
    二叉树
    笛卡尔树
    二叉堆
    vim配置
    使用vim-pathogen 进行插件管理
    C/C++中的变量和静态变量
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078859.html
Copyright © 2020-2023  润新知