算法
(二分答案) $O(n\log n)$
根据题意,Bessie 发表了 $N$ 篇论文,故 $h$ 最大不会超过 $N$。为了更加方便视觉观察引用的变化,我们可以按照引用次数从大到小来排序论文。这样,水平方向的 $h$ 值与垂直方向的 $h$ 值就是 $h$ 指数(就是找最大的正方形),为了最大化 $h$,我们需要测试从 $1$ 到 $N$ 各个值取最大。为了加速程序运行,可以用二分答案来快速锁定答案。
另外,由于一篇综述中只能引用一篇论文至多一次,以及 $K$ 篇综述最多只能引用 $K \cdot L$ 篇论文。在测试 $h$ 值时,需要满足两个条件:
- 总共增加的引用数不得超过 $K \cdot L$
- 每篇论文最多增加的引用数不得大于 $K$
C++ 代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
int main() {
int n, k, l;
cin >> n >> k >> l;
vector<int> c(n);
rep(i, n) cin >> c[i];
ranges::sort(c, greater<>());
int ac = 0, wa = n+1;
while (abs(ac-wa) > 1) {
int wj = (ac+wa)/2;
auto ok = [&]{
ll need = 0;
rep(i, wj) need += max(0, wj-c[i]);
return need <= (ll)k*l and wj-c[wj-1] <= k;
}();
(ok ? ac : wa) = wj;
}
cout << ac << '\n';
return 0;
}