2016 12-1

問題描述

試題編號: 201612-1
試題名稱: 中間數
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  在一個整數序列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。

 

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1000 + 10;
int n,a[maxn];
int main()
{
    bool sign = false;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a,a + n);
    int r = 0;
    for(int i = 0;i < n;i = r)
    {
        int l = lower_bound(a,a + n,a[i]) - a;
        r = upper_bound(a,a + n,a[i]) - a;
//        printf("%d %d %d\n",i,l,r);
        int rr = n - r;
        if(rr  >= 0 && l == rr)
        {
            printf("%d",a[i]);
            sign = true;
        }
//        printf("%d %d %d\n",a[i],l,r);
    }
    if(!sign) printf("-1\n");
    return 0;
}

排序以後,使用lower_bound函數和upper_bound找出每個數比它小的和比它大的數分別有多少,在循環時記得i = r,不然可能會重複輸出數。仙女我把最喜歡的綠茶身體乳丟了,我恨啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章