Let's suppose that $L = 0$; then we just want to compute the $h$-index of Bessie's papers with no additional citations. To find this, we can sort the citation counts from largest to smallest, and find the largest $h$ such that the first $h$ papers all have at least $h$ citations. This can be done in one pass through the sorted counts.

Now let's consider how to use $L$ extra citations to increase the $h$-index. Since the survey cannot cite any one paper multiple times, it's not possible to increase the $h$-index by more than $1$: the $(h+1)$-st most cited paper before the survey had at most $h$ citations, so afterwards it cannot have more than $h+1$ citations.

But it's not always possible to increase the $h$-index by one. When is it possible? Well, out of the top $h$ papers before the survey, some $k$ of them have exactly $h$ citations (and the rest have more than $h$). We need to cite each of these $k$ papers. Additionally, we need to cite the $(h+1)$-st most cited paper. So it's necessary that $L \geq k+1$. Finally, if the $(h+1)$-st most cited paper has less than $h$ citations, then we cannot hope to increase the $h$-index. Conversely, if it has $h$ citations (it cannot have more than $h$), and if $L \geq k+1$, then the $h$-index can be increased to $h+1$.

Below is Danny Mittal's code, which does a slight variation on the above idea. This program increments the citation counts of the $[h-L+2, h+1]$-most cited papers (which we've seen is optimal) and checks what the new $h$-index is.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; import java.util.StringTokenizer; public class AcowdemiaI { static int hIndex(Integer[] papers) { int h = papers.length; while (h > 0 && papers[h - 1] < h) { h--; } return h; } public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tokenizer = new StringTokenizer(in.readLine()); int n = Integer.parseInt(tokenizer.nextToken()); int l = Integer.parseInt(tokenizer.nextToken()); Integer[] papers = new Integer[n]; tokenizer = new StringTokenizer(in.readLine()); for (int j = 0; j < n; j++) { papers[j] = Integer.parseInt(tokenizer.nextToken()); } Arrays.sort(papers, Comparator.reverseOrder()); int h = hIndex(papers); if (h != n) { for (int j = h; j >= 0 && j > h - l; j--) { papers[j]++; } } Arrays.sort(papers, Comparator.reverseOrder()); System.out.println(hIndex(papers)); } }