20
本来不是很难得一道题 可是连续的应该不是必须从首位开始的吧?
接下来解释为什么会有这个问题
先贴oj通过的程序(copy别人的此处引用)
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<math.h>
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; i<n; i++)
scanf("%d",&a[i]);
ans=0;
for(i=0; i<n; i++)
{
w=1;
for(j=0; j<n; j++)
{
w*=a[j];
if(w>ans)
ans=w;
}
}
if(ans>0)
cout<<ans<<endl;
else
printf("-1\n");
}
return 0;
}
不懂第二个for循环有什么作用 既然接下来的for循环每次都是j=0开始 那么执行n次并无意义
而且只能找到从首位开始乘积最大的子序列 不可以找到中间最大的子序列
接下来是改的第三个for循环
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<math.h>
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; i<n; i++)
scanf("%d",&a[i]);
ans=0;
for(i=0; i<n; i++)
{
w=1;
for(j=i; j<n; j++)
{
w*=a[j];
if(w>ans)
ans=w;
}
}
if(ans>0)
cout<<ans<<endl;
else
printf("-1\n");
}
return 0;
}
接下来帖自己写的
#include<stdio.h>
#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;b<n;b++)
printf("0");
printf("\n");}
else{
zero[++m]=n+1;
for(int i=0;i<num0+1;i++){//for0
for(int j=zero[i]+1;j<zero[i+1];j++){//for1
if(a[j]<0)
num++;///0与0之间的负数个数
else
num1++;
}//for1
if((num%2)==0 && (num1!=0 || num!=0)){//if1////当两个0中间的数的负数为偶数且有非0数
for(int p=zero[i]+1;p<zero[i+1];p++){//for2
most=most*a[p];////求出当前积
}//for2
}//if1
else{//else1
if((num%2)!=0 && (zero[i+1]-zero[i])>2){
for(int q=zero[i]+1;q<zero[i+1];q++){///for3
if(a[q]<0)
fu1++;
if(fu1<num)
most=most*a[q];
if(a[zero[i+1]-q+zero[i]]<0)
fu2++;
if(fu2<num)
most1=most1*a[zero[i-1]-q+zero[i]];
}//for3
if(most<most1)
most=most1;
}
else
most=a[zero[i]+1];
} //else1
if(result<most )
result=most;
most=most1=1;
num=num1=0;
}//for0
if(result>0)
printf("%d\n",result);
else
printf("-1\n");
num10=0;
}
}//else0
}
return 0;
}
如果输入
9
0 -1 0 2 3 0 7 8 0
oj通过的程序得到的是-1
改过的和自己的 得到的是56
是我没读懂题 还是为什么
原文:http://blog.csdn.net/lfanchenyu/article/details/51334485