Розглянемо, як визначити -індекс для заданого масиву чисел. Спочатку відсортуємо масив за спаданням. Потім знайдемо найбільше значення таке, що елементи на позиціях від до мають значення не менші за . Іншими словами, шукаємо максимальне , для якого виконується умова a_h \ge h.
Наприклад, у наступному випадку -індекс дорівнює , оскільки a_3 ≥ 3, але a_4 < 4.
Після додавання цитувань -індекс не може збільшитися більш ніж на . Справді, оскільки a_{h+1} < h + 1, а кожну статтю можна процитувати не більше одного разу, максимум, що ми можемо зробити, – це збільшити a_{h + 1} на (якщо початково a_{h + 1} = h).
Далі, починаючи з позиції h + 1 і рухаючись у бік менших індексів, будемо збільшувати елементи масиву на . Іншими словами, збільшимо на елементи на відрізку a[max(1, h - l + 2); h + 1].
Після цього знову відсортуємо масив за спаданням і перерахуємо -індекс. Отримане значення і буде відповіддю.
Приклад
У першому прикладі Бессі не може цитувати свої статті, тому її -індекс для набору (1, 100, 2, 3) дорівнює .
У другому прикладі, якщо Бессі процитує третю статтю, кількість цитувань стане (1, 100, 3, 3). У цьому випадку -індекс збільшиться до .
Розглянемо наступний приклад. Числа вже наведені в порядку спадання. -індекс даного масиву дорівнює .
Нехай l = 2. Збільшимо елементи на і знову відсортуємо масив за спаданням. -індекс отриманого масиву як і раніше дорівнює .
Нехай l = 4. Збільшимо елементи на і потім відсортуємо масив за спаданням. У результаті -індекс отриманого масиву стане рівним .
Реалізація алгоритму
Функція hIndex обчислює -індекс для масиву, попередньо відсортованого за спаданням. Індексація починається з . Функція повертає максимальне значення , для якого виконується умова v_i \ge i. Якщо такого індексу немає (-індекс масиву дорівнює ), то повертаємо значення v.size() - 1, рівне .
int hIndex(vector<int> &v)
{
for (int i = 1; i < v.size(); i++)
if (v[i] < i) return i - 1;
return v.size() - 1;
}Основна частина програми. Читаємо вхідні дані.
scanf("%d %d", &n, &l);
v.resize(n + 1);
for (i = 1; i <= n; i++)
scanf("%d", &v[i]);Сортуємо масив за спаданням, починаючи з першого елемента.
sort(v.begin() + 1, v.end(), greater<int>());Обчислюємо -індекс вихідного масиву.
h = hIndex(v);Починаючи з позиції h + 1 і рухаючись у бік менших індексів, збільшуємо відповідні значення v_i на .
for (i = h + 1; i > max(h - l + 1, 0); i--)
v[i]++;Сортуємо масив за спаданням і обчислюємо його новий -індекс.
sort(v.begin() + 1, v.end(), greater<int>());
h = hIndex(v);Виводимо відповідь.
printf("%d\n", h);