原题:
算法提高 最大乘积 时间限制: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;}
新闻热点
疑难解答