算法提高 最大乘积
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。
每组输入数据共2行:
第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
输出格式
每组数据输出1行,为最大的乘积。
样例输入
1
5 5
1 2 3 4 2
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 }
悠游天地间 all rights reserved. © 2013 -- 1 << 64