题目大意:给你T组测试数据,接下来每行第一个数是给你n个数(范围在-1000~1000之间) 让你打印出最大连续子序列和以及起始和终止位置。如果存在多种情况,只需要打印出其中一种情况即可。
解题思路:这道题与HDU1231 那道题大相径庭,并未有什么太大的不同。唯一的不同就是HDU1231是打印最大连续子序列和以及起始数和终止的数,而此题是打印最大连续子序列和以及起始和终止位置。首先如果这n个数全部都为负数的我们就for遍历一次,寻找其中全部负数中最大的数,起始和终止位置都是它本身的位置。另一种情况就和HDU1231差不多 就记录的变成位置了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
using namespace std;
const int maxn=100005;
int a[maxn],num1;
int beginnum,endnum,sum;
int main()
{
int t,n,num=1;
scanf("%d",&t);
while(t--)
{
num1=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]<0)
num1++;
}
if(num1==n)//输入的数全部为负数
{
int minn=-1001;//因为输入数在-1000~1000
int m=1;
for(int i=1;i<=n;i++)
{
if(minn<a[i])
{
minn=a[i];
m=i;
}
}
printf("Case %d:\n",num++);
printf("%d %d %d\n",minn,m,m);
if(t!=0)
printf("\n");//注意换行
}
else
{
int left=1;//初始化
int right=1;//初始化
int maxs=a[1];//初始化
int sum=a[1];//初始化
beginnum=1;//初始化
endnum=1;//初始化
for(int i=2;i<=n;i++)
{
if(sum>0)
{
sum+=a[i];
right=i;//换掉尾的位置
}
if(sum<=0)
{
sum=a[i];//重新开始 因为不可能全部为负数 有正数
left=i;//因为重新开始 起始位置换掉
right=i;//尾位置换掉
}
if(sum>maxs)
{
maxs=sum;//当遍历过程中有大于当前的最大连续子序列的和 换掉
beginnum=left;//更新最大连续子序列和起始位置
endnum=right;//更新最大连续子序列和尾位置
}
}
printf("Case %d:\n",num++);
printf("%d %d %d\n",maxs,beginnum,endnum);
if(t!=0)
printf("\n");
}
}
return 0;
}
31msA掉
END!!!!!!!!!!!!!!!!!!!