1. 程式人生 > >csp 201612-1 中間數

csp 201612-1 中間數

  • 題目

問題描述

  在一個整數序列a1, a2, …, an中,如果存在某個數,大於它的整數數量等於小於它的整數數量,則稱其為中間數。在一個序列中,可能存在多個下標不相同的中間數,這些中間數的值是相同的。   給定一個整數序列,請找出這個整數序列的中間數的值。

輸入格式

  輸入的第一行包含了一個整數n,表示整數序列中數的個數。   第二行包含n個正整數,依次表示a1, a2, …, an

輸出格式

  如果約定序列的中間數存在,則輸出中間數的值,否則輸出-1表示不存在中間數。

樣例輸入

6 2 6 5 6 3 5

樣例輸出

5

樣例說明

  比5小的數有2個,比5大的數也有2個。

樣例輸入

4 3 4 6 7

樣例輸出

-1

樣例說明

  在序列中的4個數都不滿足中間數的定義。

樣例輸入

5 3 4 6 6 7

樣例輸出

-1

樣例說明

  在序列中的5個數都不滿足中間數的定義。

評測用例規模與約定

  對於所有評測用例,1 ≤ n ≤ 1000,1 ≤ ai ≤ 1000。

  • 基本思路

這題的中間數大概定義就是一個數如果大於其他的數的數量等於小於其他的數的數量就是中間數,而且題目已經說明了只有一箇中間數,所以只要我們找到了就沒必要再找下去,輸出那個符合條件的就可以了,如果都沒有符合的話,那就輸出-1

  • 演算法思想

兩層for迴圈,第一層for迴圈就是遍歷每個數,看哪個數符合。然後第二層迴圈就是從新遍歷,去遍歷全部的數,大於它的加1

,小於它的加1,兩個變數如果相等的話就是中間數,輸出這個數就結束了。

  • 流程
  1. 讀入一個n
  2. 讀入n個數
  3. 第一層for迴圈,找中間數
  4. 第二層迴圈,如果小於就+1,大於也+1
  5. 如果小於的數量等於大於的數量就輸出答案
  6. 如果變數過去都沒有的話,那就是輸出-1
  • 程式碼實現

#include<cstdio>

#include<cstring>

#include<cstdlib>

using namespace std;

const int maxn=1009;

int a[maxn],ans[maxn];

int main(){

    int n,k=0;

    scanf("%d",&n);///輸入數量

    for(int i=0;i<n;++i){

        scanf("%d",&a[i]);///讀入n個數據

    }

    for(int i=0;i<n;++i){

    int low=0,high=0;

        for(int j=0;j<n;++j){

            if(a[i]>a[j]){///比它的大的數就high+1

                ++high;

            }else if(a[i]<a[j]){///比它小的數就low+1

                ++low;

            }

        }

        if(high==low){///如果兩個數量相等,就直接輸出,題目很明確只有應該答案,所以就沒必要再繼續找了

            ans[k++]=a[i];

            printf("%d\n",a[i]);

            return 0;

        }

    }

    if(k==0){///如果都沒有的話,就輸出-1

        puts("-1");

        return 0;

    }

    return 0;

}