杭电OJ 1003

 刚拿到题目觉得很简单:用一个数组保存每组输入的序列,然后两层遍。第一层按照起始位置遍历,第二层按照结束位置遍历。代码如下:

//杭电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;
}


  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值