魔卡少女樱CLEAR CARD篇,小樱都上初中了,她说要好好学数学。她有一道作业题是这样的:给你一个数列,要你写出其一个子数列,这个子数列的要求是连续且和最大,如果有多条子数列和一样大就取最前面的一条。
例如,对于数列(-5,6,-1,5,4,-7),就取第2位到第5位这一段,总和为:6 + (-1) + 5 + 4 = 14即是总和最大的一段。
例如,对于数列(-5,6,-1,5,4,-7),就取第2位到第5位这一段,总和为:6 + (-1) + 5 + 4 = 14即是总和最大的一段。
Input输入数据的第一行是一个整数T(1<=T<=20)表示测试实例的个数,然后是T行数据,每一行的开始是一个整数N(1<=N<=100000),然后是N个整数(-1000<=0<=1000).
Output对于每个测试实例,你要输出两行,第一行是"Case #:",#是第#组数据的意思,第二行包含三个整数,最大子数列和,子数列的起始位置,子数列的结束位置。
注意每两组测试样例之间有一个空行。
Sample Input
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Sample OutputCase 1:
14 1 4 Case 2: 7 1 6
思考这道题目时,需要将数据考虑完全
1)题目所给普通数据
2)当其中遇到断点,对初始位置的定位
3)当所有数据都为负数时例
#include<iostream> using namespace std; const int maxn=1e5+10; int a[maxn]; int main() { int t,n; int sum; int x=1; int st,k; cin>>t; while(t--) { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int max=-99999; int s=1;//开始 sum=0; for(int i=1;i<=n;i++) { sum+=a[i]; if(sum>max) { max=sum; k=i; st=s; } if(sum<0)//若和小于0,说明负值大,舍去这一段,继续重新开始 { sum=0; s=i+1; } } if(x!=1)cout<<endl; cout<<"Case "<<x<<":"<<endl; cout<<max<<" "<<st<<" "<<k<<endl; x++; } return 0; }