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\n",sum);
35     }
36     return 0;
37 }
View Code

 

相关文章:

  • 2022-12-23
  • 2021-05-28
  • 2022-03-10
猜你喜欢
  • 2022-12-23
  • 2021-05-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案