题目
代码
这道题很久之前写二分没A,发现不该枚举具体的值。
终于想到求出来的
E
E
E必然是a[i]或a[i]-1
那么从大到小,检查排序后的a[i]或a[i]-1即可。但若顺序检查,测试点3还是会超时
因为数据规模为
1
0
5
10^5
105,
O
(
n
2
)
>
=
1
0
10
O(n^2) >=10^{10}
O(n2)>=1010,所以还是该考虑
O
(
n
log
n
)
O(n\log n)
O(nlogn)算法。
那么对下标进行二分就可以了。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> arr(n);
for(int i = 0;i < n; ++i) {
cin >> arr[i];
}
auto check = [&](int mid){
int cnt = 0;
for(auto & x : arr) {
if(x > mid)
cnt++;
}
return cnt >= mid;
};
vector<int> a(arr);
sort(a.begin(), a.end());
int l = 0, r = n; // [l, r)
while(l + 1 < r) {
int mid = (l + r) / 2;
int L = a[mid];
if(check(L) || check(L - 1)) {
l = mid;
} else {
r = mid;
}
}
if(check(a[l])) {
cout << a[l] << endl;
} else {
cout << a[l] - 1 << endl;
}
}