首页 > 学院 > 开发设计 > 正文

蓝桥杯算法提高 最大乘积

2019-11-08 19:57:20
字体:
来源:转载
供稿:网友

原题:

 算法提高 最大乘积  时间限制:1.0s   内存限制:512.0MB    问题描述  对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?输入格式  第一行一个数表示数据组数  每组输入数据共2行:  第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,  第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。输出格式  每组数据输出1行,为最大的乘积。样例输入15 51 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;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表