您的位置:首页 > 其它

Max Sum

2015-08-14 20:05 288 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/A

题意:

输入一组数,找出连续子序列中,最大的和。并输出和最大的子序列的首位置和末位置。

案例:

input

2

5 6 -1 5 4 -7

7 0 6 -1 1 -6 7 -5

output

Case 1:

14 1 4

Case 2:

7 1 6

思路分析:

让所有数从头开始相加,当和为负数时,只会让和变小,这时和清零,以下一个位置为起点再相加。找到最大和。

源代码如下:

#include<iostream>
#include<cstdio>
#define MAX 100005
using namespace std;
int main()
{
int T,N,t=1,x,y,maxn,sum,k,s[MAX];
scanf("%d",&T);
while(T--)
{
int i;
scanf("%d",&N);
for(i=1;i<=N;i++)
scanf("%d",&s[i]);
x=1;y=1;maxn=-9999;sum=0;k=1;       //maxn一定要足够小
for(i=1;i<=N;i++)
{
sum+=s[i];
if(sum>maxn)
{
maxn=sum;
x=k;
y=i;
}
if(sum<0)
{
sum=0;
k=i+1;       //确定新的起点
}
}
printf("Case %d:\n%d %d %d\n",t++,maxn,x,y);
if(T)printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: