説明
最悪の場合、素子のn個の最小値と最大値を見つけるために、3N / 2-2の比較のnの数を、所与。
機能のみを記述するために必要な
無効(MAXMIN のint []、int型の低、int型高、int型 * MAX、INT *分)。
系统会自动在程序的最后加上如下代码:
INT メイン() { INT MAX、MIN、K、[ 200 ]。 int型メートル。 一方、(scanf関数(" %dの"、及びk)&& K) { 用(M = 0 ; M <K; M ++ ) のscanf(" %dの"、および[M])。 MAXMIN(0、K- 1、およびMAX、&分)。 printf(" %D%D \ N " 、MAX、MIN); } }
入力
テストデータの複数のセット。各テストの最初の要素は、nは整数、続いて整数nは、です。0は終わりを示します。N <= 200
出力
この最大個数nの最小値。
サンプル入力
5 1 8 2 4 3 3 2 4 1 0
サンプル出力
1 8 4 1
あなたが予想に沿ったものではないことが明らかであり、アレイ内の最大値と最小値を、取得するためのn-1回以上通過する前に比較する必要がある場合は、そこに除算を使用することやアイデアを征服する必要があります。
三つの主要なステップがある分割統治
1.分解:元の問題がいくつかのより小さなサブ問題に分割されているが。
2.解決:十分に小さいサブ問題点を解決し、それを解決するために行ったことがあります。
3.マージ:子供の問題の解決策は、元の問題の解決にマージ。
それは常に半分である。この問題のために、分解不可分配列要素まで、配列要素は最大最小問題は、元の問題に対する1つの解決策によって一つに合わせ、最小です。
書式#include <cstdioを> する#include <アルゴリズム> の#define 0x3f3f3f3f INF 使用して 名前空間はstdを、 無効 MAXMIN(int型 *、int型左、int型の右、int型 * MAX、INT * 分) { int型ミッド。 INT LMAX = 0、LMIN = INF、RMAX = 0、RMIN = INF。 もし(左== 右) { *マックス= [左]。 *分= [右]。 返します。 } 中旬=(左+右)/ 2 。 MAXMIN(左、中央、&LMAX、&LMIN)。 MAXMIN(中間 + 1、右、およびRMAX、&RMIN)。 もし(LMAX> RMAX) { *最大= LMAX。 } 他 { *最大= RMAX。 } であれば(LMIN < RMIN) { *分= LMIN。 } 他 { *分= RMIN。 } } int型のmain() { int型 MAX、MIN、K、[ 200 ]。 int型メートル。 一方、(scanf関数(" %dの"、及びk)&& K) { 用(M = 0 ; M <K; M ++ ) のscanf(" %dの"、および[M])。 MAXMIN(0、K- 1、およびMAX、&分)。 printf(" %D%D \ N " 、MAX、MIN); } }