题目:点击打开链接
思路:在输入的时候就记录第一个非负数和最后一个非负数的位置。把序列分为全为非负数和不全为非负数两种情况:
1.全为非负数,根据题目要求输出sum为0,以及第一个和最后一个数字;
2.不全为非负数,利用遍历选择。
注意:要考虑到数字为0的情况
代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int K;
cin>>K;
int j,i=0;
vector<int> seq(K);
int num[2]={0,0};
int sum0,sum1,f1,f2;
sum1=-1; //作为最终最优值,设为-1是为了将总和为0的情况也能记录下来
f1=f2=-1; //记录第一个和最后一个非负数的位置
//输入
for(;i<K;++i)
{
cin>>seq[i];
if(seq[i]>=0)
{
f2=i; //最后非负数位置
if(f1==-1) //初始非负数位置
f1=i;
}
}
if(f1==-1) //序列全为负数的情况
{
cout<<0<<" "<<seq[0]<<" "<<seq[K-1]<<endl;
}
else
{
for(i=f1;i<=f2;++i)
{
sum0=0;
for(j=i;j<=f2;++j)
{
sum0+=seq[j];
if(sum0>sum1)
{
sum1=sum0;
num[0]=i;
num[1]=j;
}
}
}
cout<<sum1<<" "<<seq[num[0]]<<" "<<seq[num[1]]<<endl;
}
system("pause");
return 0;
}