最大の連続したサブシーケンス
時間制限:1000MSメモリ制限:32768KB 64ビットIOフォーマット:%I64d&%I64u
説明
K個の整数のシーケンス{N1、N2、…、NK}が与えられると、任意の連続サブシーケンスは{Ni、Ni + 1、…、
Nj}として表すことができます。ここで、1 <= i <= j <= Kです。最大の連続サブシーケンスは、すべての連続サブ
シーケンスの要素合計の最大のものです。たとえば、シーケンス{-2、11、-4、13、-5、-2}が与えられた場合、その最大の連続サブシーケンスは{11、- 4、13}、および最大
20。
今年の論文のデータ構造では、最大の増加を得るためにプログラミングが必要であり、
最初と最後の要素シーケンスも出力する必要がある要件になりました。
入力
テスト入力にはいくつかのテストケースが含まれ、各テストケースは2行を占め、最初の行は正の整数K(<10000)を示し、2番目の行はスペースで区切られたK個の整数を示します。Kが0の場合、入力は終了し、ユースケースは処理されません。
出力
各テストについて、1行目の最大出力と、
スペースで区切られた最大連続シーケンス要素の最初と最後の要素。最大の連続サブシーケンスが一意でない場合は、シーケンス番号iとjが最小のサブシーケンスを出力します(入力サンプルの2番目と3番目のグループなど)。すべてのK要素が負の数の場合、最大合計は0として定義され、シーケンス全体の最初と最後の要素が出力されます。
サンプル入力
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3~7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
サンプル出力
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
ヒント
ヒント巨大な入力、scanfをお勧めします。
分析:
**時間計算量はO(N)です。
左から右へのシーケンスの合計が0未満の場合は、前のものを破棄し、この番号を開始点として開始します。
0以上の場合は、常時加算し、最大値を継続的に更新してください。最大値が更新された場合にのみ、格納された開始点LLが開始点として使用され(前のシーケンスよりも小さいが正の次のシーケンスの開始点の更新を回避するため)、終了点が更新されます。****
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int maxn = 1e4+5;
int num[maxn];
int main(){
int n,max,sum;
while(scanf("%d",&n),n){
for( int i=0 ; i<n ; i++ ){
scanf("%d",&num[i]);
}
int l,r,ll;
max = num[0];
sum = 0;
l=num[0];
r=num[0];
for( int i=0 ; i<n ; i++ ){
if(sum < 0){
sum = num[i];
ll = num[i];
}
else{
sum += num[i];
}
if( sum > max ){
max = sum;
r = num[i];
l=ll;
}
}
if(max<0){
printf("0 %d %d\n",num[0],num[n-1]);
}
else{
printf("%d %d %d\n",max,l,r);
}
}
return 0;
}