问题描述
对于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
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
int A[20],sum=1;
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>A[i];
sort(A,A+n);
int st=0,en=n-1,now1,now2,t=0;
if(m%2==0)
{
while(t!=m)
{
now1=A[st]*A[st+1];
now2=A[en]*A[en-1];
if(now1>now2)
{
sum*=now1;
st+=2;
}
else
{
sum*=now2;
en-=2;
}
t+=2;
}
cout<<sum<<endl;
}
else
{
if(A[n-1]>0)
{
m=m-1;
en=en-1;
while(t!=m)
{
now1=A[st]*A[st+1];
now2=A[en]*A[en-1];
if(now1>now2)
{
sum*=now1;
st+=2;
}
else
{
sum*=now2;
en-=2;
}
t+=2;
}
cout<<sum*A[n-1]<<endl;
}
else
{
m=m-1;
en=en-1;
while(t!=m)
{
now1=A[st]*A[st+1];
now2=A[en]*A[en-1];
if(now1<now2)
{
sum*=now1;
st+=2;
}
else
{
sum*=now2;
en-=2;
}
t+=2;
}
cout<<sum*A[n-1]<<endl;
}
}
}
return 0;
}
#include <algorithm>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
int A[20],sum=1;
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>A[i];
sort(A,A+n);
int st=0,en=n-1,now1,now2,t=0;
if(m%2==0)
{
while(t!=m)
{
now1=A[st]*A[st+1];
now2=A[en]*A[en-1];
if(now1>now2)
{
sum*=now1;
st+=2;
}
else
{
sum*=now2;
en-=2;
}
t+=2;
}
cout<<sum<<endl;
}
else
{
if(A[n-1]>0)
{
m=m-1;
en=en-1;
while(t!=m)
{
now1=A[st]*A[st+1];
now2=A[en]*A[en-1];
if(now1>now2)
{
sum*=now1;
st+=2;
}
else
{
sum*=now2;
en-=2;
}
t+=2;
}
cout<<sum*A[n-1]<<endl;
}
else
{
m=m-1;
en=en-1;
while(t!=m)
{
now1=A[st]*A[st+1];
now2=A[en]*A[en-1];
if(now1<now2)
{
sum*=now1;
st+=2;
}
else
{
sum*=now2;
en-=2;
}
t+=2;
}
cout<<sum*A[n-1]<<endl;
}
}
}
return 0;
}