問題描述
試題編號: | 201612-1 |
試題名稱: | 中間數 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: |
問題描述 在一個整數序列a1, a2, …, an中,如果存在某個數,大於它的整數數量等於小於它的整數數量,則稱其爲中間數。在一個序列中,可能存在多個下標不相同的中間數,這些中間數的值是相同的。 輸入格式 輸入的第一行包含了一個整數n,表示整數序列中數的個數。 輸出格式 如果約定序列的中間數存在,則輸出中間數的值,否則輸出-1表示不存在中間數。 樣例輸入 6 樣例輸出 5 樣例說明 比5小的數有2個,比5大的數也有2個。 樣例輸入 4 樣例輸出 -1 樣例說明 在序列中的4個數都不滿足中間數的定義。 樣例輸入 5 樣例輸出 -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,不然可能會重複輸出數。仙女我把最喜歡的綠茶身體乳丟了,我恨啊!