输出要求:最大子类和长度 起始点 结束点
#include <stdio.h>
//全是负数 输出第一个元素和最后一个元素 最大和为 0
//如果有多个最大和相同 输出最小的那个
int main (){
int n;
scanf("%d", &n);//我现在需要的是now对应的那个begin 那个数值而不是那些其他的玩意
int max = 0,now = 0,begin,end,temp = 0;
int data[n],mark = 0;
for(int i = 0; i < n ;++i){
scanf("%d", &data[i]);
if(data[i] >= 0)
mark++;
}
if(mark){
for(int i = 0; i < n ;++i){
now += data[i];
if(now < 0){
now = 0;
if(i +1<n)
temp = i+1;
}
if(max < now){
begin = temp;
max = now;
end = i;
}
}
if(max == 0)
printf("0 0 0");
else
printf("%d %d %d",max,data[begin],data[end]);
}else
printf("%d %d %d",max,data[0],data[n-1]);
return 0;
}
这题的代码写的并不优美,整体思路还是沿袭上题的在线处理。
但是这题出现了几种特殊的测试情况,所以就多加了几种判断语句。
1.其中对于所有数都小于0 就直接输出 0 然后起始点就是从0到n-1。
2.对于存在大于等于0的情况,则需要考虑 0的个数 如果全是0 则最后的结果就应该是0 0 0.而如果是负数和0,同样全是0.
如果最大子列和前面有多个0,则前面那个变量的更新应该满足下列条件
将新读取的数据加入到当前的最大子列和后最大子列和减小为负数,更新为下一个。亦即从这次的开始移动到上次的结束,借此避免漏掉0.
更简单的那个实验
上述的两个问题是我自己写的时候遇到的两个测试点,以及我的不怎么好的解决方案。