試題編號: | 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。
|
問題分析:
在本題中,我們首先需要聲明兩個變量數組和n,判斷的函數也相應的給出並傳入數組和n值。
我用的方法比較淳樸點啦,分別利用三個指針,i,j,z來定位數組中的位置信息。i表示數組中的一個點,j和z分別表示其右面和左面的數值。
其工作流程如下圖:
ps(鄙人的方法比較簡單易懂一些),如果想了解更好的方法,我們也可以用排序函數,會更好一些。
參考見:http://blog.csdn.net/ynynleslie/article/details/54670226
#include <iostream>
#include<stdio.h>
using namespace std;
void ifMiddleNum(int a[],int n)
{
int minNum = 0;
int maxNum = 0;
int i, j,z;
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++)
{
for (z = i; z > 0; z--)
{
if (a[z]<a[i])
{
minNum++;
}
if (a[z]>a[i])
{
maxNum++;
}
}
if (a[j] < a[i])
{
minNum++;
}
if (a[j] > a[i])
{
maxNum++;
}
}
}
if (minNum == maxNum)
{
cout << a[i] << endl;
}
if (minNum != maxNum)
{
cout << -1 << endl;
}
}
int main()
{
int num;
int vec[1000];
cin >> num;
for (int i = 0; i < num; i++)
{
cin >> vec[num];
}
ifMiddleNum(vec,num);
return 0;
}