原题:
算法提高 最大乘积
时间限制: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
分析:
一开始想着先排序然后i,j分别记住开始和结束,然后两个两个相乘取大的乘积,错了好几次才反应过来,如果是负的两个相乘比较大,就取这两个,而如果是两个正的相乘比较大,则只取最大的那一个正数,这样保证如果m为奇数,最后取得那个数比较大。
代码:
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int num[n],sum = 1;
for(int i = 0;i < n;i++)
cin>>num[i];
sort(num,num+n);
int i = 0,j = n - 1;
while(m >= 2)
{
if(num[i] * num[i + 1] >= num[j] * num[j - 1])
{
sum *= num[i] * num[i + 1];
i += 2;
m -= 2;
}
else
{
sum *= num[j];
j--;
m--;
}
}
if(m == 1)
{
sum *= num[j];
}
cout<<sum<<endl;
}
return 0;
}