题目来源:https://biancheng.love/contest-ng/index.html#/34/problems
题目描述
Nova君想要找个徒弟和他一起玩游戏机,然而,Nova君是个要求很多的人,游戏能力在他之上的或者和他一样强的都不要,要了岂不是很没面子 ╮(╯▽╰)╭ 能力太差的也不要_Orz__ 所以Nova君决定在游戏能力在他之下的人里挑选能力最强的。世界那么大,很可能有一些人能力值一样。Nova君在想,到底有多少人有资格呢?请来帮帮他找机友。
输入
多组测试数据(组数不超过10),对于每组数据,输入两行,第一行为两个正整数N和M,分别表示所有候选人的个数以及Nova君的能力值;第二行包含N个正整数,表示N个候选人的能力值(已经按非降序排列好)。N<=1000000
输出
对于每组数据,输出一行,输出有资格的人的个数。
输入样例
7 9
2 4 6 8 8 8 9
输出样例
3
HINT
请用二分实现
解题思路:
根据题目要求,我们需要做的就是找到能力不超过自己的能力最大的人。也就是第二大数有多少个。
要求使用二分实现。
二分实现的一些函数lower_bound upper_bound.
推荐博客:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html
现在给出代码:
#include <bits/stdc++.h> #define MAX 10000010 using namespace std; int a[MAX]; int main() { int n,m,k; int *f,*p,*l; while(~scanf("%d%d", &n,&m)) { for(int i=0;i<n;i++) scanf("%d",&a[i]); p=lower_bound(a,a+n,m); k=*(p-1); f=lower_bound(a,a+n,k); l=upper_bound(a,a+n,k); printf("%d ", l-f); } }