Ordenemos los costos de los productos de forma no decreciente. Supongamos que en la promoción participan productos con costos c_1 \le c_2 \le ... \le c_k. Al comprador le resulta más conveniente adquirir los dos más caros de ellos — c_{k−1} y c_k. Si c_{k−1} + c_k > x, recibirá el cuerno de unicornio de regalo.
Sean a_1, a_2, ..., a_n los costos ordenados de todos los productos. Entonces en la promoción deben incluirse los productos con costos a_1, a_2, ..., a_k, donde — es el mayor índice para el cual a_{k−1} + a_k \le x.
Ejemplo
En el primer ejemplo, los costos ordenados son: \{1, 2, 3, 4, 5\}. Dado que x = 6, buscamos el mayor índice para el cual a_{k−1} + a_k \le 6. Este es k = 3, ya que 2 + 3 ≤ 6, pero 3 + 4 > 6.
En el segundo ejemplo, los costos ordenados son: \{1, 4, 7, 8, 9\}. Dado que x = 10, el mayor índice es igual a : 1 + 4 \le 10, pero 4 + 7 > 10.
Implementación del algoritmo
Leemos los datos de entrada.
scanf("%d %d", &n, &x);
v.resize(n);
for (i = 0; i < n; i++)
scanf("%d", &v[i]);Ordenamos los costos de los productos de forma no decreciente.
sort(v.begin(), v.end());Recorremos los pares de productos vecinos e i + 1. Tan pronto como v_i + v_{i+1} > x, el producto con costo v_{i+1} y todos los siguientes a él ya no pueden incluirse en la promoción.
res = n;
for (i = 0; i + 1 < n; i++)
if (v[i] + v[i + 1] > x)
{Entonces la cantidad máxima de productos en la promoción es igual a i + 1 (la numeración comienza desde cero).
res = i + 1;
break;
}Mostramos la respuesta.
printf("%d\n", res);