您的位置:首页 > 其它

最大乘积问题

2018-01-24 15:33 134 查看
题目要求:输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列,如果这个最大的乘积不是正数,英输出-1(无解)。1<=n<=18,-10<=Si<=10. 

样例输入: 



2 4 -3 



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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: