1. 程式人生 > >CSP201612-1:中間數

CSP201612-1:中間數

pri void algorithm 研究生 pos man lac amp ron

引言: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 10001 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:中間數