Processing math: 100%
(Analysis by Dhruv Rohatgi )

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 Lk+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 Lk+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 [hL+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));
    }
}