最大乘积问题
2018-01-24 15:33
134 查看
题目要求:输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列,如果这个最大的乘积不是正数,英输出-1(无解)。1<=n<=18,-10<=Si<=10.
样例输入:
3
2 4 -3
5
2 5 -1 2 -1
样例输出:
8
20
解决方法:暴力枚举法
代码如下:
#include<algorithm> //要用到sort函数(排序)
#include<string.h> //要用到memset函数(数组清零)
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
double *p = new double
;
for (int i = 0; i<n; i++)
{
cin >> p[i];
} //对数据进行输入
double q[100];
int k = 0;
memset(q, 0, sizeof(q));
double s = 1.0;
for (int i = 0; i < n; i++)
{
s = p[i];
for (int j = i + 1; j < n; j++)
{
s = s*p[j];
q[k++] = s;//计算完一次 K++
//cout<<q[k-1]<<endl;//输出中间的计算结果
}
}
sort(q, q + k);//利用sort进行排序 总共是 K个
if (q[k-1]<0)
cout << -1;
else
cout << q[k-1];
}
知识点总结:
1.memset是计算机中C/C++语言函数。将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向s的指针memset作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
2.double *p = new double
;开辟n个double型元素的内存空间,即数组,这个值会被复制p[i]
int n;
cin >> n;
double *p = new double
;
for (int i = 0; i<n; i++)
{
cin >> p[i];
}
//对数据进行输入
3.sort函数形式:sort(first_pointer,first_pointer+n,cmp)
参数解释: 第一个参数是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。第二个参数相对较好理解,即首地址加上数组的长度n(代表尾地址的下一地址)。最后一个参数是比较函数的名称(自定义函数cmp),这个比较函数可以不写,即第三个参数可以缺省,这样sort会默认按数组升序排序。
简单例子:对数组A的0~n-1元素进行升序排序(共n个元素),只要写sort(A,A+n)即可;对于向量V也一样,sort(v.begin(),v.end())即可。
4.核心算法:
for (int i = 0; i < n; i++)
{
s = p[i];//s=p[0] s=p[1] s=p[2]...
for (int j = i + 1; j < n; j++)
{
s = s*p[j];//p[j]=p[i+1]
q[k++] = s;//计算完一次 K++
//cout<<q[k-1]<<endl;//输出中间的计算结果
}
}
2 4 -3
结果依次为:8 -24 -12
2 5 -1 2 -1
结果依次为:10 -10 -20 20 -5 -10 10 -2 2 -2
然后利用sort进行排序 再通过if语句判断下有没有正数 输出最大值q[k-1]
样例输入:
3
2 4 -3
5
2 5 -1 2 -1
样例输出:
8
20
解决方法:暴力枚举法
代码如下:
#include<algorithm> //要用到sort函数(排序)
#include<string.h> //要用到memset函数(数组清零)
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
double *p = new double
;
for (int i = 0; i<n; i++)
{
cin >> p[i];
} //对数据进行输入
double q[100];
int k = 0;
memset(q, 0, sizeof(q));
double s = 1.0;
for (int i = 0; i < n; i++)
{
s = p[i];
for (int j = i + 1; j < n; j++)
{
s = s*p[j];
q[k++] = s;//计算完一次 K++
//cout<<q[k-1]<<endl;//输出中间的计算结果
}
}
sort(q, q + k);//利用sort进行排序 总共是 K个
if (q[k-1]<0)
cout << -1;
else
cout << q[k-1];
}
知识点总结:
1.memset是计算机中C/C++语言函数。将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向s的指针memset作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
2.double *p = new double
;开辟n个double型元素的内存空间,即数组,这个值会被复制p[i]
int n;
cin >> n;
double *p = new double
;
for (int i = 0; i<n; i++)
{
cin >> p[i];
}
//对数据进行输入
3.sort函数形式:sort(first_pointer,first_pointer+n,cmp)
参数解释: 第一个参数是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。第二个参数相对较好理解,即首地址加上数组的长度n(代表尾地址的下一地址)。最后一个参数是比较函数的名称(自定义函数cmp),这个比较函数可以不写,即第三个参数可以缺省,这样sort会默认按数组升序排序。
简单例子:对数组A的0~n-1元素进行升序排序(共n个元素),只要写sort(A,A+n)即可;对于向量V也一样,sort(v.begin(),v.end())即可。
4.核心算法:
for (int i = 0; i < n; i++)
{
s = p[i];//s=p[0] s=p[1] s=p[2]...
for (int j = i + 1; j < n; j++)
{
s = s*p[j];//p[j]=p[i+1]
q[k++] = s;//计算完一次 K++
//cout<<q[k-1]<<endl;//输出中间的计算结果
}
}
2 4 -3
结果依次为:8 -24 -12
2 5 -1 2 -1
结果依次为:10 -10 -20 20 -5 -10 10 -2 2 -2
然后利用sort进行排序 再通过if语句判断下有没有正数 输出最大值q[k-1]
相关文章推荐
- 子数组的最大乘积问题
- 最大连续子序列和,乘积,最长递增子串,最长公共子串,子序列等问题(动态规划等)
- 子序列的最大乘积问题
- 贪心算法----正整数分解问题 和相同,乘积最大
- FOJ 1208 最大k乘积问题
- 蓝桥杯 算法训练—— 最大乘积问题
- AOJ-190 乘积最大问题
- 【C源码】最大乘积问题
- 算法 最大k乘积问题
- 最大子序乘积问题的分析
- 整数拆分并且乘积最大问题
- FZU_1208_最大k乘积问题
- 最大k乘积问题
- 动态规划——看似dp的贪心问题最大乘积(蓝桥杯试题集)
- 乘积最大问题——动态规划
- JAVA代码—算法基础:最大连续子数组乘积问题
- 最大k乘积问题
- 最大k乘积问题
- 微软面试题---求子数组最大乘积问题
- 最大乘积问题