CSP201612-1:中間數
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中國計算機學會(CCF)發起的"計算機職業資格認證"考試,針對計算機軟件開發、軟件測試、信息管理等領域的專業人士進行能力認證。認證對象是從事或將要從事IT領域專業技術與技術管理人員,以及高校招考研究生的復試對象。
- 問題描述
在一個整數序列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。
- 思路說明
首先利用sort()函數對輸入的n個數字進行升序排列,這樣所有值相同的數都會相鄰。然後通過循環可以找到一組重復的數的起點i,終點j,只要i之前的數的個數等於j之後的數的個數,則說明這一組重復的數就是我們要找的中間數。
- 源代碼
# include <stdio.h> # include <stdlib.h> # include <memory.h> # include <algorithm>
using namespace std;
bool compare(int a, int b) { return a < b; }
int main(void) { int n; //個數 int sign = 1; scanf("%d", &n); int *input = (int *)malloc(sizeof(int) * n); memset(input, 0, sizeof(int) * n); for (int i = 0; i < n; i++) { scanf("%d", input+i); }
sort(input, input+n, compare); //升序排列
int i, j; for (i = 0; i < n; ) { for (j = i; j < n; j++) { if (input[i] != input[j]) { break; } } if (i == n - j) //大於input[i]數的個數 = 小於input[i]數的個數 { printf("%d\n", input[i]); sign = 0; } i = j; } if (sign) { printf("%d\n", -1); }
return 0; } |
CSP201612-1:中間數