题目描述:
输入:
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
题意:找出连续的几个数使其和最大,并且输出序列的首尾元素.
思路:利用了vector容器不会的可以搜一下,首先定义a[N],b[N],stl容器c。用b数组存储连续子段和
,用c容器记录连续子段,定义ans为最终结果。(注意数据量较大,用scanf输入)
代码:
#include<iostream>
#include<vector>
using namespace std;
#define ll long long
#include<cstring>
const ll N=1e7+5;
ll a[N],b[N];
int main()
{
ll n;
while(scanf("%lld",&n),n)
{
ll ans=-12345;
ll q=-1,w=-1;
vector<ll>c;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]+b[i-1]>a[i])
{
b[i]=a[i]+b[i-1];
c.push_back(a[i]);
}
else
{
b[i]=a[i];
c.clear();
c.push_back(a[i]);
}
if(b[i]>ans)
{
ans=b[i];
q=c[0];
w=c[c.size()-1];
}
}
if(ans<0)printf("0 %lld %lld\n",a[1],a[n]);
else printf("%lld %lld %lld\n",ans,q,w);
}
return 0;
}