看过去小程序的疑惑

问题 C 最大乘积
时间限制: 1 Sec 内存限制: 128 MB
[提交]
题目描述

输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列,如果这个最大的乘积不是正数,则输出-1

输入

输入包括多组数据,每组数据第一行为正整数n,第二行为n个元素组成的序列S,1<=n<=18,-10<=Si<=10

输出

输出每组数据的结果后换行

样例输入
3
2 4 -3
5
2 5 -1 2 -1
样例输出
8

20

本来不是很难得一道题 可是连续的应该不是必须从首位开始的吧?

接下来解释为什么会有这个问题

先贴oj通过的程序(copy别人的此处引用)

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int a[30];
int i,j;
int main()
{
    int n;
    long long  w;
    long long ans;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0; ians)
                    ans=w;
            }
        }
        if(ans>0)
cout<
不懂第二个for循环有什么作用 既然接下来的for循环每次都是j=0开始 那么执行n次并无意义

而且只能找到从首位开始乘积最大的子序列 不可以找到中间最大的子序列


接下来是改的第三个for循环

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int a[30];
int i,j;
int main()
{
    int n;
    long long  w;
    long long ans;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0; ians)
                    ans=w;
            }
        }
        if(ans>0)
cout<

改为j=i开始 保证了最大子序列不包括开头

接下来帖自己写的

#include
#define N 0
int main(){
    int a[20]={N},zero[20]={0};
    int num0,num,num1,fu1,fu2,most,num10,most1,result;
    int n,m,k;
    while   (scanf("%d",&n)!=EOF){
    num0=num=num1=m=fu1=fu2=num10=0;
    most=most1=1;
    k=1;
    result=0;
    while(k<=n){
        scanf("%d",&a[k]);
        if(a[k]==0){
            zero[++m]=k;0所在的位置
            num0++;///0的个数
        }
        if(a[k]==10)
            num10++;
        k++;
    }
    if((n==1 && a[1]<1) || num0==n)
        printf("-1\n");
    else
    {//else0
        if(num10==n){
            printf("1");
            for(int b=0;b2){
            for(int q=zero[i]+1;q0)
    printf("%d\n",result);
    else
        printf("-1\n");
    num10=0;
        }
    }//else0
    }
return 0;
}

可是oj只能通过第一个

如果输入

9

0 -1 0 2 3 0 7 8 0

oj通过的程序得到的是-1

改过的和自己的 得到的是56

是我没读懂题 还是为什么

你可能感兴趣的:(acm作业,最大乘积子序列)