您的位置:首页 > 其它

蓝桥杯 - 最大乘积

2016-02-12 16:51 344 查看

算法提高 最大乘积

时间限制: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

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
int t, n, m;
int num[20];
scanf("%d", &t);
while(t--){
scanf("%d %d", &n, &m);

for(int i = 0; i < n; i++)
scanf("%d", &num[i]);

sort(num, num+n);

int i, j, a, b;
i = j = 0;
long long ans = 1;

while(m){
a = num[i]*num[i+1];
b = num[n-j-1]*num[n-j-2];

if(a>=b && m>=2){
ans*=a;
i+=2;
m-=2;
}
else{
ans*=num[n-j-1];
j++;
m--;
}
}
printf("%lld\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: