3 条题解
-
2
224. NOIP2015PJ-28(题解)
题面
28.(完善程序)
(中位数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() { cin >> n >> m; for(i = 0; i < n; i++) cin >> x[i]; lbound = 0; rbound = m; while(_________________________) { mid = (lbound + rbound) / 2; _________________________; for(i = 0; i < n; i++) if(_________________________) _________________________; if(count > n / 2) lbound = mid + 1; else _________________________; cout << mid << " " << lbound << " " << rbound << " " << count << endl; } cout << rbound << endl; return 0; }分析
1.二分法模板(直接套)
秒了1,2,4,5题好吧~
2.思维
注意!mid是一个数,要用mid与x数组的数来比较 而不是x数组与x数组的数进行比较
3.解析
①:[lbound<=rbound]
②:[count=0]
③:[mid<=x[i]]
④:[count++]
⑤:[rbound=mid-1]
最后!!!
不要输入多余的空格!(只写代码)
吃过亏的都emo......了
-
-2
#include <iostream> using namespace std; const int MAXN = 1000; int n, i, lbound, rbound, mid, m, count; int x[MAXN]; int main() { cin >> n >> m; for(i = 0; i < n; i++) cin >> x[i]; lbound = 0; rbound = m; while(_________________________) { mid = (lbound + rbound) / 2; _________________________; for(i = 0; i < n; i++) if(_________________________) _________________________; if(count > n / 2) lbound = mid + 1; else _________________________; cout << mid << " " << lbound << " " << rbound << " " << count << endl; } cout << rbound << endl; return 0; }
- 1
信息
- ID
- 224
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 280
- 已通过
- 23
- 上传者