(临时抱佛脚ing…)
题目大意
给出 n n n 个数,求最大的 E E E,满足恰有 E E E 个值大于 E E E。
解题思路
E E E 越小,肯定更容易满足,因此 E E E 满足单调性,可以进行二分求解。
注意事项
1.使用 upper_bound()
函数,获得第一个大于某数的位置:
int pos = upper_bound(d, d + n, mid) - d;
2.最后的答案是 l − 1 l-1 l−1 噢~
参考代码
const int N = 1e5 + 10;
inline int readint() {int x; scanf("%d", &x); return x;}
int d[N], n;
bool check(int mid) {
int pos = upper_bound(d, d + n, mid) - d;
return (n - pos) >= mid;
}
int main() {
n = readint();
for(int i = 0; i < n; ++i) {
d[i] = readint();
}
sort(d, d + n);
int l = 0, r = n + 1;
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) l = mid + 1;
else r = mid;
}
printf("%d", l - 1);
return 0;
}