正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 普及 2011 第一轮真题 › 第 25 题

NOIP 普及 2011 第一轮 第 25 题:用频次数组求中位数

阅读程序 · 排序算法 · 答案 3

题目

```
#include<iostream>
#include<cstring>
using namespace std;

const int SIZE = 100;

int main()
{
    int n,i,sum,x,a[SIZE];
    
    cin>>n;
    memset(a,0,sizeof(a));
    
    for(i=1;i<=n;i++){
        cin>>x;
        a[x]++;
    }
    i=0;
    sum=0;
    while(sum<(n/2+1)){
        i++;
        sum+=a[i];
    }
    cout<<i<<endl;
    return 0;
}
```
输入:  
11  
4 5 6 6 4 3 3 2 3 2 1

本小题

阅读程序写结果

答案

3

题解

考点定位

本题考「计数数组模拟」,对应大纲 4.2.1 程序模拟(难度【3】)。

解题过程

11 个数:4,5,6,6,4,3,3,2,3,2,1。计数:a[1]=1,a[2]=2,a[3]=3,a[4]=2,a[5]=1,a[6]=2。

while 找累加和 ≥ n/2+1 = 6 的最小 i:

ia[i]sum
111
223
336 ≥6 ✓

输出 3。

易错提醒

① 该程序求「第 ⌈n/2⌉ 小的值」(多数元素/中位数变体);② 累加条件 sum<(n/2+1) 是整数除法 n/2=5 ⇒ 目标 6。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号