(中位数 median)
给定 n(n 为奇数且小于 1000)个整数,
整数的范围在 0~m(0<m<2^31)之间,
请使用二分法
求这 n 个整数的中位数。
所谓中位数,是指将这 n 个数排序之后,
排在正中间的数。
(第五空 2分,其余 3 分)
#include <iostream>
using namespace std;
const int MAXN = 1000;
int n, i, lbound, rbound, mid, m, count;
int x[MAXN];
int main()
{
//求这 n 个整数的中位数
cin >> n >> m; //5 100 0~m(0<m<2^31)
for (i = 0; i < n; i++)
cin >> x[i]; //1 6 3 99 2
lbound = 0;
rbound = m;
while ( lbound < rbound )
{
mid = (lbound + rbound) / 2; //(0+100)/2=50
count=0;
for (i = 0; i < n; i++)
if (x[i]>mid)
count++;
if (count > n / 2)
lbound = mid + 1;
else
rbound=mid;
cout <<"mid="<< mid << " lbound=" << lbound << " rbound=" << rbound << " count=" << count << endl;
}
cout << rbound << endl;
return (0);
}
/*
1.正确答案: lbound <= rbound
2.正确答案: count = 0
3.正确答案: x[i] >= mid
4.正确答案: count++
5.正确答案: rbound = mid-1
5 100
1 6 3 99 2
mid=50 lbound=0 rbound=50 count=1
mid=25 lbound=0 rbound=25 count=1
mid=12 lbound=0 rbound=12 count=1
mid=6 lbound=0 rbound=6 count=1
mid=3 lbound=0 rbound=3 count=2
mid=1 lbound=2 rbound=3 count=4
mid=2 lbound=3 rbound=3 count=3
3
--------------------------------
Process exited after 3.95 seconds with return value 0
请按任意键继续. . .
*/
NOIP 2015 普及组初赛
2015年信息学奥赛普及组初赛视频详解
2011-2020NOIP/CSP普及组初赛真题解析