• 算法提高 最大乘积


    http://lx.lanqiao.org/problem.page?gpid=T136

    算法提高 最大乘积  
    时间限制: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
     
    分析:
    因为a[i]可能含有负数,所以要考虑负数存在的情况,
    先给数组排序,(包括负数)
    贪心的从两头分别找两个数相乘,比较两个乘积,
    左边(负数)大的时候选择左边,
    右边大的时候只选右边一个。
    注意m值得大小。
     
    AC代码:
     
     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 int a[20];
     6 
     7 int main()
     8 {
     9     int t , n , m , i , j , now1 , now2 , sum;
    10     scanf("%d",&t);
    11     while(t --)
    12     {
    13         scanf("%d%d",&n,&m);
    14         for(i = 0 ; i < n; i ++)
    15             scanf("%d",&a[i]);
    16         sort(a,a + n);
    17         sum = 1;
    18         for(i = n - 1,j = 0; i >= j && m != 0;)
    19         {
    20             now1 = a[i] * a[i - 1];
    21             now2 = a[j] * a[j + 1];
    22             if(now1 <= now2 && m >= 2)
    23             {
    24                 sum *= now2;
    25                 j += 2;
    26                 m -= 2;
    27             }
    28             else
    29             {
    30                 sum *= a[i --];
    31                 m --;
    32             }
    33         }
    34         printf("%d
    ",sum);
    35     }
    36     return 0;
    37 }
    View Code
  • 相关阅读:
    Visual Studio for Mac 2017 初体验
    利用栈求表达式的值
    Problem C: ChongQueue
    Problem G: ZL's Prob.2
    Problem F: ZL's Prob.1
    Problem B: ChongBit
    HDU 5156
    SHUOJ 1771
    OpenGL学习整理------着色器
    OpenGL ES着色器语言----------------储存修饰符
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4450855.html
Copyright © 2020-2023  润新知