刚拿到题目觉得很简单:用一个数组保存每组输入的序列,然后两层遍。第一层按照起始位置遍历,第二层按照结束位置遍历。代码如下:
//杭电OJ 1003 张艺川 2018/1/27
#include<iostream>
using namespace std;
int main(){
int T;//T组数据,最多20组
cin >> T;
int maxSum[20]; //用于存每一组的最大和 最多20组
int maxBegin[20];//用于存每一组最大和的起始位置
int maxEnd[20];//用于存每一组最大和的终止为止
for (int i = 0; i < T; i++){//分别处理每一组的数据的输入和计算
int N;
cin >> N;//每一组N个数
int *number = new int[N];
//int number[100000];//用于保存N个数,N<=10w
for (int j = 0; j < N; j++){//输入N个数
cin >> number[j];
}
maxSum[i] = 0;//初始化
maxBegin[i] = 0;
maxEnd[i] = 0;
for (int begin = 0; begin < N; begin++){//起始位置从第一个数遍历到最后一个数
int tempSum = 0;//每一次更换初始位置就初始化tempSum
for (int end = begin; end < N; end++){//末端从起始位置遍历到最后一个数
tempSum += number[end];
if (tempSum>maxSum[i]){
maxSum[i] = tempSum;
maxBegin[i] = begin;
maxEnd[i] = end;
}
}
}
delete[]number;
}
for (int i = 0; i < T; i++){
cout << "Case " << i + 1 << ":" << endl;
cout << maxSum[i] << " " << maxBegin[i] + 1 << " " << maxEnd[i] + 1 << endl;
if (i != T - 1)
cout << endl;
}
cin.get();
cin.get();
return 0;
}
不过结果就是超时。原因在于:数组的输入和读取很花费时间。如果将输入的数据直接进行处理,而不必先存起来再处理。那时间开销就能小很多。更改后代码如下:
//杭电OJ 1003 张艺川 2018/1/27
#include<iostream>
using namespace std;
int main(){
int T;//T组数据,最多20组
cin >> T;
int maxSum[20]; //用于存每一组的最大和 最多20组
int maxBegin[20];//用于存每一组最大和的起始位置
int maxEnd[20];//用于存每一组最大和的终止为止
for (int i = 0; i < T; i++){//对于每一组数据输入并处理
int N;
cin >> N;
maxSum[i] = -1001;//初始化最后输出结果
maxBegin[i] = 0;
maxEnd[i] = 0;
int tempNum ;//接收每一次输入
int tempSum = 0;//临时和
int tempBegin = 0;//当前子串开始的位置
for (int j = 0; j < N; j++){//N个数输入并处理
cin >> tempNum;
tempSum += tempNum;//加上新输入的数
if (tempSum > maxSum[i]){//如果加上后和变大并且超过了最大和
maxSum[i] = tempSum;//更新最大和
maxEnd[i] = j;//更新结束位置
maxBegin[i] = tempBegin;//初始位置保持不变
}
if (tempSum < 0){//如果加上后值为负,说明新加的数很小
tempSum = 0;//放弃之前的子串,重新计数
tempBegin = j + 1;//开始位置更新为下一个位置
}
}
}
for (int i = 0; i < T; i++){
cout << "Case " << i + 1 << ":" << endl;
cout << maxSum[i] << " " << maxBegin[i] + 1 << " " << maxEnd[i] + 1 << endl;
if (i != T - 1)
cout << endl;
}
cin.get();
cin.get();
return 0;
}