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=13Max=12
Min=6
筆記
這道題我是暴力窮舉出來的。
這裏主要記錄一下求數據類型的能表示的最大數的方法。
無符號數據類型的能表示的最大數 = 2^(字節數 * 8),有符號數據類型還要折半再減一。用c語言表示如下:
const int MAX = pow(2,sizeof(int)*8)/2-1;
其中,函數pow在頭文件math.h中聲明,函數原型爲:
double pow(double x, double y)
表示x的y次方。
代碼
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int MAX = pow(2,sizeof(int)*8)/2-1;
const int MIN = -1;
int main(){
int m,n;
int num[101];
int flag = 1;
while(scanf("%d %d",&m,&n)!=EOF){
int i,j;
for(i=0;i<m;i++) {
scanf("%d",&num[i]);
}
int min = MAX,max = MIN;
int sum = 0;
for(i=0;i<m;i++){
sum = 0;
for(j=0;j<n;j++){
int index = i+j;
if(index>=m){
index = index % m;
}
sum+=num[index];
}
if(sum>max){
max = sum;
}
if(sum<min){
min = sum;
}
}
if(flag){
flag = 0;
}else{
printf("\n\n");
}
printf("Max=%d\nMin=%d",max,min);
}
return 0;
}