一、题目
二、分析
如果只是简单的循环枚举h,那么整个算法的时间复杂度是O(n*n),显然超时。
设当前枚举最大指数为x,而正确的最大指数为h(答案):
当x>h:不存在综述中引用 L篇论文即可达到h指数的情况。
当x<=h:存在综述中引用不多于 L篇论文即可达到h指数的情况。
由此可见,答案h存在二分性。
三、代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, L;
int a[N];
bool If(int x)
{
int sum = 0;
for (int i = n; i > n - x; i--)
{
if (x == a[i] + 1)
sum++;
if (x > a[i] + 1)
return false;
}
return sum <= L;
}
int main()
{
cin >> n >> L;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + 1 + n);
int l = 0, r = n;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (If(mid))
l = mid;
else
r = mid - 1;
}
cout << l << endl;
return 0;
}