算法提高 最大乘积

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

 

你可能感兴趣的:(算法)