Приз, який ніхто не може виграти#9878

Приз, який ніхто не може виграти (Розбір)

Відсортуємо вартості товарів за неспаданням. Нехай в акції беруть участь товари з вартостями c_1 \le c_2 \le ... \le c_k. Покупцю найвигідніше придбати два найдорожчі з них — c_{k−1} та c_k. Якщо c_{k−1} + c_k > x, він отримає ріг єдинорога в подарунок.

Нехай a_1, a_2, ..., a_n — відсортовані вартості всіх товарів. Тоді до акції слід включити товари з вартостями a_1, a_2, ..., a_k, де — найбільший індекс, для якого a_{k−1} + a_k \le x.

Приклад

У першому прикладі відсортовані вартості: \{1, 2, 3, 4, 5\}. Оскільки x = 6, шукаємо найбільший індекс , для якого a_{k−1} + a_k \le 6. Це k = 3, оскільки 2 + 3 ≤ 6, але 3 + 4 > 6.

У другому прикладі відсортовані вартості: \{1, 4, 7, 8, 9\}. Оскільки x = 10, найбільший індекс дорівнює : 1 + 4 \le 10, але 4 + 7 > 10.

Реалізація алгоритму

Зчитуємо вхідні дані.

scanf("%d %d", \&n, \&x);
v.resize(n);
for (i = 0; i < n; i++)
  scanf("%d", \&v[i]);

Сортуємо вартості товарів за неспаданням.

sort(v.begin(), v.end());

Перебираємо пари сусідніх товарів та i + 1. Щойно v_i + v_{i+1} > x, товар вартістю v_{i+1} та всі наступні за ним вже не можна включати до акції.

res = n;
for (i = 0; i + 1 < n; i++)
  if (v[i] + v[i + 1] > x)
  {

Тоді максимальна кількість товарів в акції дорівнює i + 1 (нумерація починається з нуля).

    res = i + 1;
    break;
  }

Виводимо відповідь.

printf("%d\n", res);