蓝桥杯 算法提高 最大乘积

问题描述

  对于n个数,,从中取出m个数,如何取使得这m个数的乘积最大呢?

输入格式

  第一行一个数表示数据组数  每组输入数据共2行:  第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,  第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。

输出格式

  每组数据输出1行,为最大的乘积。

样例输入

15 51 2 3 4 2

样例输出

48

将输入的数据存入数组然后做升序排列。然后开始从末端循环,每次循环都求出正序前两个数字的积和逆序前两个数字的积,然后进行比较。

我们规定经sort排序后从左到右为正序,从右到左为逆序

如果逆序前两个的积大于正序前两个的积,则sum*逆序第一个数字,m–;

如果逆序前两个的积小于或者等于正序前两个的积(此时要满足m大于等于2,因为有可能是两个负数),则sum*正序后两个的积,m=m-2。

#include <iostream>#include <algorithm>using namespace std;int main(){int T,n,m,a[20];cin>>T;while(T–){long long now1,now2,sum=1;//用long long防止sum超限cin>>n>>m;for(int i=0;i<n;i++)cin>>a[i];sort(a,a+n);for(int i=n-1,j=0;i>=j&&m!=0;i–){now1=a[i]*a[i-1]; //逆序now2=a[j]*a[j+1]; //正序if(now1<=now2&&m>=2)//now1=now2时也要选now2 ,因为这样下次选得时候选得要最大{sum=sum*now2;i++; //i++再经过for循环中的i–等于没变j=j+2;m=m-2; //选负数的时候一次选两个。}else{sum=sum*a[i];m–; //选正数的时候一次选一个。}}cout<<sum<<endl;}return 0;}

一个人最大的破产是绝望,最大的资产是希望。

蓝桥杯 算法提高 最大乘积

相关文章:

你感兴趣的文章:

标签云: