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≥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≥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)); } }