CCF 試題解析附加源碼(2016-12)

試題編號: 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;
}


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