总结:
之前 在Basic里做过这道题,那时候 根据陈姥 并参考了网上对特殊数据的处理 抄完代码A的
现在 再做 有些思路 在线处理?
只是对于特殊数据 -1 0 0 -1 要不是之前做过 可能真得想不到··· 具体解决方法参考代码
#include<iostream>
using namespace std;
int main()
{
int K, i;
int *arr;
while( cin>>K )
{
arr = new int[K];
for( i=0; i<K; i++ )
cin>>arr[i];
int ans, first, last, temp, sum;// ans 最终的最大值 sum当前最大值
ans = sum = 0;
first = temp = 0;
last = K-1;// last 一开始 我初始化为 0了 后来读题知道 如果序列中元素都是负数 那么 输出结果 为 0 0 K-1
for( i=0; i<K; i++ )
{
sum+=arr[i];
if( sum > ans || ( sum==0&&first == 0 ) )// 解决“总结”中的 方法 是多加一条 或 语句 即更新一下 当前的 first 和 last
{
ans = sum; // 如果不更新 输出结果为 0 -1 -1 而正确结果应该是 0 0 0
last = i; // 即最大序列只有一个元素为 第二个元素 0
first = temp;
}
else if( sum<0 )
{
sum=0;
temp = i+1;
}
}
cout<<ans<<" "<<arr[first]<<" "<<arr[last]<<endl;
}
return 0;
}
2015.9.6 Ver2.0
#include<iostream>
#include<cstdio>
#include<fstream>
#include<vector>
using namespace std;
vector<int>vec;
int main()
{
//ifstream cin("test.txt");
int K;
int sum=-1, tmp, S, E;//一开始sum初始化0 未考虑到最大连续子序列和为0的情况
cin>>K;
vec.resize(K);
for(int i=0; i<K; i++)
cin>>vec[i];
for(int i=0; i<K; i++)
{
tmp=0;
for(int j=i; j<K; j++)
{
tmp+=vec[j];
if(tmp>sum)
{
sum=tmp;
S=vec[i];
E=vec[j];
}
}
}
if(sum<0)
{
cout<<0<<" "<<vec[0]<<" "<<vec[K-1]<<endl;
return 0;
}
cout<<sum<<" "<<S<<" "<<E<<endl;
return 0;
}