问题描述 :
明明喜欢玩游戏,而明明的爸爸也乐意陪明明玩各种各样的小游戏。但是在游戏中,明明的爸爸又十分注意培养明明的智力,他希望通过游戏,不仅让明明得到快乐,而且又能让明明学到一些知识,锻炼他的思维能力,为将来的发展打下基础。一天,明明的爸爸和明明做起了一个叫“最大与最小”的游戏,游戏的规则简单但却很有趣,就是有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
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void quickSort(int low,int high,int R[]){
int temp;
int i=low,j=high;
if(low<high){
temp=R[low];
while(i<j){
while(j>i&&R[j]>=temp){
--j;
}
if(i<j){
R[i]=R[j];
++i;
}
while(i<j&&R[i]<temp){
++i;
}
if(i<j){
R[j]=R[i];
--j;
}
}
R[i]=temp;
quickSort(low,i-1,R);
quickSort(i+1,high,R);
}
}
int main(int argc, char *argv[]) {
int m,n,i,j,p[105],ret[105],temp;
while(scanf("%d%d",&m,&n) != EOF) {
for(i=0;i<m;i++) {
scanf("%d",&p[i]);
//初始化
ret[i]=0;
}
for(i=0;i<m;i++) {
for(j=i;j<i+n;j++) {
if(j>=m) {
ret[i] += p[j%m];
}else
ret[i] += p[j];
}
}
quickSort(0,m-1,ret);
// for(i=0;i<m;i++){
// printf("%d ",ret[i]);
// }
printf("Max=%d\nMin=%d\n\n",ret[m-1],ret[0]);
}
return 0;
}