過去のウィジェットの疑惑を見る


問題C最大積
時間制限:1 Secメモリ制限:128 MB
[コミット]
タイトルの説明
n個の要素からなるシーケンスSを入力すると、最大積の連続サブシーケンスを見つける必要があります.この最大積が正数でない場合、出力-1
入力
入力は、複数のデータ群を含み、各データ群の第1の行の正の整数n、第2の行の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<
2 2番目のforループがどのような役割を果たすか分からない次のforループが毎回j=0で始まる以上n回実行しても意味がない
最初から積が最大のサブシーケンスしか見つからない中間最大のサブシーケンスは見つからない
次は3番目の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
"); else {//else0 if(num10==n){ printf("1"); for(int b=0;b2){ for(int q=zero[i]+1;q0) printf("%d
",result); else printf("-1
"); num10=0; } }//else0 } return 0; }

しかしojは最初の
入力した場合
9
0 -1 0 2 3 0 7 8 0
ojが通過したプログラムは-1である
改めることと自分の得ることは56です
私が問題を読めなかったのか、それともなぜか.