CSP201909-1小明种苹果

CSP201909-1小明种苹果_第1张图片

CSP201909-1小明种苹果_第2张图片

思路
由子任务说明可以知道,N和M都不会超过1000,因此可以定义一个1000*1000的整形数组来存放每一棵树的疏果情况,再定义一个大小为1000的整形数组来存放每棵树疏果前的苹果个数。二维数组每一行的所有元素相加就是此树的疏果个数的相反数,再将这个相加和与疏果前的苹果个数相加即为此树疏果后的个数。
源代码

#include
using namespace std;
int apple[1000][1000];
int main()
{
	int N, M;
	int Total[1000];
	cin >> N >> M;
	int T = 0;
	int k;
	int P = 0;
	int sum = 0;
	for (int i = 0; i < N; i++) {
		cin >> Total[i];
		for (int j = 0; j < M; j++) {
			cin >> apple[i][j];
			sum += apple[i][j];
		}
		if (P > sum) {
			P = sum;
			k = i + 1;
		}
		Total[i] += sum;
		T += Total[i];
		sum = 0;
	}
	cout << T << " " << k << " " << abs(P);
	return 0;
}

在考试的时候这个题我只得了80分,原因是我把数组apple定义在main函数里了,此时的apple数组为局部变量,被分配在栈中。其实在调试代码的时候就发现程序会引发异常,我以为只是机房的电脑配置太低导致的,后来用自己的电脑发现也是会引发异常。解决这个问题的一个方案就是将apple数组改为全局变量,让编译器为它在静态变量存储区分配空间。
当然,最好的方法就是不要使用太大的数组,以免出现错误,下面是改进之后的代码

#include
using namespace std;
int main()
{
	int apple[1000];	//记录每轮疏果情况
	int N, M;
	int number;	//疏果前苹果的个数
	cin >> N >> M;
	int T = 0;
	int k;
	int P = 0;
	int sum = 0;	//记录疏果个数
	for (int i = 0; i < N; i++) {
		cin >> number;
		for (int j = 0; j < M; j++) {
			cin >> apple[j];
			sum += apple[j];
		}
		if (P > sum) {
			P = sum;
			k = i + 1;
		}
		number += sum;
		T += number;
		sum = 0;
	}
	cout << T << " " << k << " " << abs(P);
	return 0;
}

你可能感兴趣的:(CSP)