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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nobleman__/article/details/79394387

算法提高 最大乘积

时间限制: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;
}
展开阅读全文

没有更多推荐了,返回首页