东华oj-进阶题第28题

28 最大与最小

作者: ZhouMingLiang 时间限制: 10S章节: 一维数组

问题描述 :

明明喜欢玩游戏,而明明的爸爸也乐意陪明明玩各种各样的小游戏。但是在游戏中,明明的爸爸又十分注意培养明明的智力,他希望通过游戏,不仅让明明得到快乐,而且又能让明明学到一些知识,锻炼他的思维能力,为将来的发展打下基础。一天,明明的爸爸和明明做起了一个叫“最大与最小”的游戏,游戏的规则简单但却很有趣,就是有M个整数,构成一个圆环,然后要在这个圆环中找出连续N个相邻的数,目的是要让这N个数的和达到最大或者最小。
例如:一共有5个整数,分别是:1、2、11、4、5,在这5个数中,取连续的3个数,然后我们能够达到的最大值是20(11+4+5),最小值是8(5+1+2)。
明明显然对这个游戏非常感兴趣,但是玩了几次后,明明发现这个游戏又并不是那么容易了,因为随着整数个数的增加,不同的取数方法越来越多,要找到最大最小值的难度就越来越高,到最后明明就变得有些不耐烦了,明明的爸爸发现了这个问题,于是就找到了你,他请你来帮明明一把,写一个程序,把这个环中可能达到的最大最小值找出来,然后告诉明明,而明明只需要找到是哪几个连续的数组成了最大最小值即可,这样可以节约很多的时间。
明明爸爸的问题可以归结为:在一个由M个整数构成圆环中,找出N个相邻的数,使其和为最大或最小。 输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有二行,测试数据的第一行包含个两个整数M、N(1≤N≤M≤100),M表示圆环中整数的个数,N表示要连续取出的数的个数,M和N用一个空格隔开;测试数据的第二行有M个整数,即圆环中的数,每个数之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果有两行,第一行首先输出“Max=”(不包含双引号),然后紧跟一个整数,即圆环中连续N个数的最大值;第二行首先输出“Min=”(不包含双引号),然后紧跟一个整数,即圆环中连续N个数的最小值。每组运算结果的行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。
注:通常,显示屏为标准输出设备。 输入范例 : 8 4 1 7 8 2 6 5 4 3 5 3 1 2 3 4 5 输出范例 :
Max=23 Min=13

Max=12 Min=6

代码:

/*
	T28 最大与最小 
	算法概述:从数组的第一个元素开始,将连续的N个数
	加起来与上一个最大值或最小值比较即可 
	(循环相加,例如在8个数1 7 8 2 6 5 4 3加4个数,
	5 4 3不够,那么就把1加上,以此类推) 
	
*/

#include<stdio.h>	
#include<limits.h>
#define MAX_SIZE 103

int main() {
	int M = 0, N = 0;
	int nums[MAX_SIZE];// 圆环内的数字 
	int i = 0;
	int start = 0;// 选取数字的起始编号  
	int sum = 0, maxSum = 0, minSum = 0;// 和,最大和,最小和 
	
	while (scanf("%d%d", &M, &N) != EOF) {
		for (i = 1; i <= M; i++) {
			scanf("%d", &nums[i]);
		} 
		
		if (N == 1) {// 特殊情况,连续一个数字,此时答案即为原数组中最大最小值
			maxSum = INT_MIN, minSum = INT_MAX;// 重置数据 
			for (i = 1; i <= M; i++) {
				if (maxSum < nums[i]) {
					maxSum = nums[i];
				}
				if (minSum > nums[i]) {
					minSum = nums[i];
				} 
			}
			printf("Max=%d\nMin=%d\n\n", maxSum, minSum);
			continue;
		}
		
		start = 1, maxSum = INT_MIN, minSum = INT_MAX;// 重置数据 
		while (start < M) {
			sum = 0;
			for (i = 0; i < N; i++) {// 累加连续的N个数 
				sum += nums[((start + i) > M) ? ((start + i) % M) : (start + i)];
			}
			if (maxSum < sum) {// 选出最大和 
				maxSum = sum;
			}
			if (minSum > sum) {// 选出最小和 
				minSum = sum;
			} 
			start++;// 后移一位
		} 
		printf("Max=%d\nMin=%d\n\n", maxSum, minSum);
	} 
	
	return 0;
} 

感觉这个题细节处理比较多,而且容易漏掉特殊情况

发布了44 篇原创文章 · 获赞 6 · 访问量 7571

猜你喜欢

转载自blog.csdn.net/qq_41409120/article/details/104360956
今日推荐