九度-题目1011:最大连续子序列

题目描述:

    给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。
输入:

测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( 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

#include <iostream>#include <cstring>

using namespace std;

int main(){    int a[10005];    int count,i,j;    int start,end;    int t_start,t_end;    int max,sum;    while(cin>>count && count>0) {        for(i=0;i<count;i++)            cin>>a[i];       // i=0;        start=end=0;        t_start=t_end=0;        max=sum=a[0];        for(i=1;i<count;i++) {            if(sum<0&&a[i]>sum) {                sum=a[i];                t_start=t_end=i;            }            else {                sum+=a[i];                t_end=i;            }            if(sum>max) {                max=sum;                start=t_start;                end=t_end;            }        }        if(max>=0)        cout<<max<<" "<<a[start]<<" "<<a[end]<<endl;        else        cout<<0<<" "<<a[0]<<" "<<a[count-1]<<endl;    }    return 0;}
时间: 2024-08-05 11:16:11

九度-题目1011:最大连续子序列的相关文章

动态规划经典题目:最大连续子序列和

最大连续子序列和问题 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20. 注:为方便起见,如果所有整数均为负数,则最大子序列和为0. 解决这样一个问题是一个很有趣的过程,我们可以尝试着从复杂度比较高的算法

九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲

转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/40718149 简单说说宽度优先搜索BFS 说实话,这是第一个自己写的宽度优先搜索的题目,之前也是不太明白之间的区别,好吧,只能说自己学的太渣-- 言归正传,对于初学者来说,可能最大的概念就是一个是深度搜索,一个是宽度搜索,好吧,我表示废话了,我其实就是这个样子的,然后一直不得甚解...所以第一次上来,我就直接搜索DFS,结果太明显,就是TLE或者MLE,然后就抓狂中,这可能是

九度OJ 1011 最长子串

#include <iostream> #include <string> #include <sstream> #include <math.h> using namespace std; int main() { int arr[10000]; int maxNum=0; int maxNow = 0; int startNum=0,endNum = 0,newStart = 0; bool setEd = false; int n; cin>&g

1011.最大连续子序列

题目描述:     给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20.现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素. 输入: 测试输入包含若干测试用例,每个测试用例占2行,第1行给出

九度oj-1533 最长上升子序列 (LIS)

http://ac.jobdu.com/problem.php?pid=1533 题目描述: 给定一个整型数组, 求这个数组的最长严格递增子序列的长度. 譬如序列1 2 2 4 3 的最长严格递增子序列为1,2,4或1,2,3.他们的长度为3. 输入: 输入可能包含多个测试案例.对于每个测试案例,输入的第一行为一个整数n(1<=n<=100000):代表将要输入的序列长度输入的第二行包括n个整数,代表这个数组中的数字.整数均在int范围内. 输出: 对于每个测试案例,输出其最长严格递增子序列长

九度题目1096:日期差值

题目描述: 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天 输入: 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD 输出: 每组数据输出一行,即日期差值 样例输入: 20110412 20110422 样例输出: 11 #include<stdio.h> #include<algorithm> #include<iostream> #include<stack> #include<vector&

九度 题目1112:拦截导弹

题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹.拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹. 输入: 每组输入有两行, 第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25), 第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的

九度 题目1394:五连击数组

转载请注明本文链接http://blog.csdn.net/yangnanhai93/article/details/40506571 题目链接:http://ac.jobdu.com/problem.php?pid=1394 问题分析: 这个问题尽管是四星的问题.可是感觉有点过于简单了. 这个题目第一个给我们的信息是须要连续的,所以肯定会对原来的数组进行排序,接下来就是找缺多少个数了.这个题目想想会发现和找N天中最大股票的问题有点类似,就是我仅仅关心我当前的数,往前看.我如今有几个数了,然后就

九度 题目1377:缓变序列

转载请注明本文链接 http://blog.csdn.net/yangnanhai93/article/details/40474355 题目链接地址:http://ac.jobdu.com/problem.php?pid=1377 这道题目的难点在于如何分析出缓变序列的特征: 1:缓变序列排序之后必须连续 证明:假设排序之后的序列为a[1] a[2] a[3]... a[n],其中a[n]-a[n-1]>1,即an与前面的数不连续,因为缓变序列要求任何一个数的前后的变化都是1,然而对于a[n]