连续最大积
题目描述
小明和他的好朋友小西在玩一个游戏,由电脑随机生成一个由-2,0,2三个数组成的数组,并且约定,谁先算出这个数组中某一段连续元素的积的最大值,就算谁赢!
比如我们有如下随机数组:
2 2 0 -2 0 2 2 -2 -2 0
在这个数组的众多连续子序列中,2 2 -2 -2这个连续子序列的积为最大。
现在小明请你帮忙算出这个最大值。
比如我们有如下随机数组:
2 2 0 -2 0 2 2 -2 -2 0
在这个数组的众多连续子序列中,2 2 -2 -2这个连续子序列的积为最大。
现在小明请你帮忙算出这个最大值。
输入
第一行输入一个正整数T,表示总共有T组数据(T <= 200)。
接下来的T组数据,每组数据第一行输入N,表示数组的元素总个数(1<= N <= 10000)。
再接下来输入N个由0,-2,2组成的元素,元素之间用空格分开。
接下来的T组数据,每组数据第一行输入N,表示数组的元素总个数(1<= N <= 10000)。
再接下来输入N个由0,-2,2组成的元素,元素之间用空格分开。
输出
对于每组数据,先输出Case数。
如果最终的答案小于等于0,直接输出0
否则若答案是2^x ,输出x即可。
每组数据占一行,具体输出格式参见样例。
如果最终的答案小于等于0,直接输出0
否则若答案是2^x ,输出x即可。
每组数据占一行,具体输出格式参见样例。
样例输入
2 2 -2 0 10 2 2 0 -2 0 2 2 -2 -2 0
样例输出
Case #1: 0 Case #2: 4
来源
管理员 QQ 1532958223
思路:刚看到这题以为是dp,但怎么都想不对的,我用的方法,
开始提交时,过了,但是后来又提交 ,超时,同样的代码,不知
道是不是后台数据出问题了,上网查了一下,看到一个思想特别
好的代码,就借鉴一下(思想也特别简单)把我的代码也粘贴出
来,大神可以指点一下。
想了几组数据大家可以测试一下,对比一下结果,寻找一下代码
的误区。
3
2 -2 2
3
-2 2 2
6
2 -2 2 -2 2 -2
6
-2 2 -2 2 -2 2
大神的:
#include <stdio.h> int main() { int T,n,a[10010],i,j,k,sum,MAX,flag; scanf("%d",&T); k=1; while(T--) { scanf("%d",&n); for (i=0; i<n; i++) scanf("%d",&a[i]); MAX=0; sum=0; for (i=0; i<n; i++) { if (a[i]>0) { if (sum<0) { sum=sum-1; } else sum=sum+1; } else if (a[i]<0) { if (sum<0) { sum=-sum+1; } else sum=-sum-1; } else sum=0; if (sum>MAX) { MAX=sum; } } sum=0; for (i=n-1; i>=0; i--) { if (a[i]>0) { if (sum<0) { sum=sum-1; } else sum=sum+1; } else if (a[i]<0) { if (sum<0) { sum=-sum+1; } else sum=-sum-1; } else sum=0; if (sum>MAX) { MAX=sum; } } printf("Case #%d: %d\n",k++,MAX); } return 0; }
我的:
#include<stdio.h> #include<string.h> int a[10000+1]; int main() { int t,n,h=0; scanf("%d",&t); while(t--) { scanf("%d",&n); int m,term=0,k=0,max=0,s=0; for(int i=0; i<n; i++) scanf("%d",&a[i]); for(int i=0; i<n; i++) { if(!a[i]) continue; term=0; k=0;s=0; for(int j=i; j<n; j++) { if(a[j]==0) break; else { if(a[j]==-2) { k++; s=0; } else s++; term++; } if(k%2==0&&k&&term>max) max=term; if(term>max&&k==0) max=term; if(k%2&&s>max) max=s; } } printf("Case #%d: %d\n",++h,max); } return 0; }
改进的:#include<stdio.h> #include<string.h> int a[10000+1]; int main() { int t,n,h=0; scanf("%d",&t); while(t--) { scanf("%d",&n); int m,term=0,k=0,max=0,s=0; for(int i=0; i<n; i++) scanf("%d",&a[i]); for(int i=0; i<n; i++) { if(a[i]==0) { term=0; k=0; s=0; continue; } if(a[i]==-2) { k++; s=0; } else s++; term++; if(k%2==0&&term>max) max=term; if(k%2&&s>max) max=s; } term=0; k=0; s=0; for(int i=n-1; i>=0; i--) { if(a[i]==0) { term=0; k=0; s=0; continue; } if(a[i]==-2) { k++; s=0; } else s++; term++; if(k%2==0&&term>max) max=term; if(k%2&&s>max) max=s; } printf("Case #%d: %d\n",++h,max); } return 0; }