HDOJ 4561連続最大積
2286 ワード
HDOJ4561
れんぞくさいだいせき
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 813 Accepted Submission(s): 305
Problem Description
小明と彼の良い友达の小西は1つのゲームを游んで、コンピュータからランダムに1つの-2,0,2の3つの数からなる配列を生成して、しかも约束して、谁が先にこの配列の中である1段の连続要素の积み重ねの最大値を算出して、たとえ谁が胜っても!
たとえば、次のランダム配列があります.
2 2 0 -2 0 2 2 -2 -2 0
この配列の多くの連続サブシーケンスの中で,2 2−2−2という連続サブシーケンスの積が最大であった.
今、明ちゃんはこの最大値を算出してください.
Input
1行目には、T組のデータが合計であることを示す正の整数Tが入力される(T<=200).
次のT組のデータは、各組のデータの最初の行にNを入力し、配列の要素の総個数(1<=N<=10000)を表す.
次に0,−2,2からなるN個の要素を入力し,要素間をスペースで区切る.
Output
データのセットごとにCase数を出力します.
最終的な答えが0以下の場合は、0を直接出力します.
そうでなければ答えが2^xであればxを出力すればよい.
各グループのデータは1行を占め、具体的な出力フォーマットはサンプルを参照してください.
Sample Input
2 2 -2 0 10 2 2 0 -2 0 2 2 -2 -2 0
Sample Output
Case #1: 0 Case #2: 4
れんぞくさいだいせき
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 813 Accepted Submission(s): 305
Problem Description
小明と彼の良い友达の小西は1つのゲームを游んで、コンピュータからランダムに1つの-2,0,2の3つの数からなる配列を生成して、しかも约束して、谁が先にこの配列の中である1段の连続要素の积み重ねの最大値を算出して、たとえ谁が胜っても!
たとえば、次のランダム配列があります.
2 2 0 -2 0 2 2 -2 -2 0
この配列の多くの連続サブシーケンスの中で,2 2−2−2という連続サブシーケンスの積が最大であった.
今、明ちゃんはこの最大値を算出してください.
Input
1行目には、T組のデータが合計であることを示す正の整数Tが入力される(T<=200).
次のT組のデータは、各組のデータの最初の行にNを入力し、配列の要素の総個数(1<=N<=10000)を表す.
次に0,−2,2からなるN個の要素を入力し,要素間をスペースで区切る.
Output
データのセットごとにCase数を出力します.
最終的な答えが0以下の場合は、0を直接出力します.
そうでなければ答えが2^xであればxを出力すればよい.
各グループのデータは1行を占め、具体的な出力フォーマットはサンプルを参照してください.
Sample Input
2 2 -2 0 10 2 2 0 -2 0 2 2 -2 -2 0
Sample Output
Case #1: 0 Case #2: 4
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
int T;
int i;
cin>>T;
vector <int> vr;
for(i=0;i<T;i++)
{
int N;
cin>>N;
int j;
vector <int> vk;
for(j=0;j<N;j++)
{
int k;
cin>>k;
vk.push_back(k);
}
int max=0;
int temp=0;
int cur=0;
for(j=0;j<N;j++)
{
int k=vk[j];
if(k>0)
temp++;
if(k<0)
{
if(cur!=0)
{
temp+=cur+1;
cur=0;
}
else
{
if(temp>max)
max=temp;
cur=temp+1;
temp=0;
}
}
if(k==0||j==N-1)
{
if(temp>max)
max=temp;
temp=0;
cur=0;
}
}
temp=0;
cur=0;
for(j=N-1;j>-1;j--)
{
int k=vk[j];
if(k>0)
temp++;
if(k<0)
{
if(cur!=0)
{
temp+=cur+1;
cur=0;
}
else
{
if(temp>max)
max=temp;
cur=temp+1;
temp=0;
}
}
if(k==0||j==0)
{
if(temp>max)
max=temp;
temp=0;
cur=0;
}
}
vr.push_back(max);
}
for(i=0;i<T;i++)
{
cout<<"Case #"<<i+1<<": "<<vr[i]<<endl;
}
return 0;
}