最大値と最小分割統治を求めます

説明

最悪の場合、素子の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); 
    } 

}

 

おすすめ

転載: www.cnblogs.com/wkfvawl/p/11460280.html