蓝桥杯练习系统算法提高—最大乘积

最大乘积 

问题描述

 对于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

思路:将输入的数据存入数组然后做升序排列。然后开始从末端循环,每次循环都求出正序前两个数字的积和逆序前两个数字的积,然后进行比较。我们规定经sort排序后从左到右为正序,从右到左为逆序如果逆序前两个的积大于正序前两个的积,则sum*逆序第一个数字,m--; 如果逆序前两个的积小于或者等于正序前两个的积(此时要满足m大于等于2,因为有可能是两个负数),则sum*正序后两个的积,m=m-2。

源代码:

<span style="font-family:Microsoft YaHei;"><span style="font-size:14px;">#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int T,n,m,a[20],i,j;
	cin>>T;
	while(T--)
	{
		long long now1,now2,sum=1;//用long long防止sum超限
		cin>>n>>m;
		for(i=0;i<n;i++)
			cin>>a[i];
		sort(a,a+n);
		for(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;
}</span><span style="font-size:18px;">
</span></span>
时间: 2024-12-09 23:35:46

蓝桥杯练习系统算法提高—最大乘积的相关文章

蓝桥杯练习系统算法提高 求最大值

问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负. 输入格式 输入的第一行为n,数对的个数 以下n行每行两个整数 ai bi 输出格式 输出你选定的数对的ai+bi之和 样例输入 5-403 -625-847 901-624 -708-293 413886 709 样例输出 1715 数据规模和约定 1<=n<=100 -1000<=ai,bi<=1000 思路: 讲道理好嘛~~自己

蓝桥杯练习系统— 算法训练 Beaver&#39;s Calculator

问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样的科学问题中. 为了测试它,聪明的海狸邀请了n位科学家,编号从1到n.第i位科学家给这个计算器带来了 ki个计算题.第i个科学家带来的问题编号1到n,并且它们必须按照编号一个一个计算,因为对于每个问题的计算都必须依赖前一个问题的计算结果. 每个教授的每个问题都用一个数 ai,?j? 来描述,i(1≤i≤n)是

蓝桥杯练习系统—算法训练 最小最大公倍数

问题描述已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式输入一个正整数N. 输出格式输出一个整数,表示你找到的最小公倍数.样例输入9样例输出504数据规模与约定1 <= N <= 106. 分析: 这个题的意思就是在1~N的范围内找三个数,使他们的最小公倍数在这个范围内的组合是最大的. 接下来先说一个结论:大于1的两个相邻的自然数必定互质. 而对于1~N的范围,肯定是 n*(n-1)*(n-2)的乘积最大.如果这三个数还两两互质的话那就最棒了. 如果n是奇

蓝桥杯练习系统—算法训练 P1102

第一部分:题目 定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度不超过1000),并输入每个元素的值,程序使用冒泡排序法将学生按照成绩从小到大的顺序排序,然后输出排序的结果. 输入格式:第一行是一个整数N(N<1000),表示元素个数:接下来N行每行描述一个元素,姓名.性别都是长度不超过20的字符串,年龄和成绩都是整型. 输出格式:按成绩从小到大输出所有元素,若多个学生成绩相同则成绩相同的同学之间保留原来的输入顺序.输入: 3 A

蓝桥杯练习系统—算法训练 s01串

第一部分:题目 问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) 输出格式 n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定 0~19 第二部分:思路 循环+中间数组.有一点小小的技巧就是,0->1,1->01.就是都变成1,只不过原先是1的话在前面加一个0. 第三部分:代码 #include<iostream> #include<stdio.h> #include<string

蓝桥杯练习系统—算法训练 未名湖畔的烦恼

问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了, 每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个. 现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面. (两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)输入格式 两个整数,表示m和n输出格式 一个整数,表示队伍的排法的方案数.样例输入3 2样例输出5数据规模和约定 m,n∈[0,18] 分析:枚举出所有情况

蓝桥杯- 算法提高 最大乘积

算法提高 最大乘积 时间限制: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 #include<iostream&

1501181723-蓝桥杯-算法提高 最大乘积

算法提高 最大乘积 时间限制: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 5 样例输出 120 解题思路 将输入的数据存入数组然后做升序

算法笔记_163:算法提高 最大乘积(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2行: 第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15, 第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4. 输出格式 每组数据输出1行,为最大的乘积. 样例输入 15 51 2 3 4 2 样例输出 48 2 解决方案 具体代码如下: import java.uti