您的位置:首页 > 其它

蓝桥杯 算法提高 最大乘积 【贪心】

2018-02-27 23:11 274 查看

算法提高 最大乘积

时间限制: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 <bits/stdc++.h>

using namespace std;

int a[111];

int main(){
ios_base::sync_with_stdio(0);
int T;cin>>T;
while (T--) {
int n,m;cin>>n>>m;
for (int i = 0; i < n; i++) {
cin>>a[i];
}
sort(a,a+n);
if(m == 1) {
cout<<a[n - 1]<<endl;continue;
}
int res = 1;
for (int i = n - 1,j = 0;j <= i;) {
if(m == 0)  break;
if(a[i] * a[i - 1] > a[j] * a[j + 1]) {
res *= a[i--];
m--;
} else {
if (m >= 2) {
res *= a[j] * a[j + 1];
m -= 2;
j += 2;
} else {
res *= a[i];
m--;
i--;
}
}
}
cout<<res<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: