Ordiniamo i prezzi dei prodotti in ordine non decrescente. Supponiamo che nella promozione partecipino prodotti con prezzi c_1 \le c_2 \le ... \le c_k. Per l'acquirente è più conveniente acquistare i due più costosi tra questi — c_{k−1} e c_k. Se c_{k−1} + c_k > x, riceverà il corno di unicorno in regalo.
Siano a_1, a_2, ..., a_n i prezzi ordinati di tutti gli prodotti. Allora nella promozione bisogna includere i prodotti con prezzi a_1, a_2, ..., a_k, dove — è l'indice massimo per cui a_{k−1} + a_k \le x.
Esempio
Nel primo esempio, i prezzi ordinati sono: \{1, 2, 3, 4, 5\}. Poiché x = 6, cerchiamo l'indice massimo per cui a_{k−1} + a_k \le 6. Questo è k = 3, poiché 2 + 3 \le 6, ma 3 + 4 > 6.
Nel secondo esempio, i prezzi ordinati sono: \{1, 4, 7, 8, 9\}. Poiché x = 10, l'indice massimo è uguale a : 1 + 4 \le 10, ma 4 + 7 > 10.
Implementazione dell'algoritmo
Leggiamo i dati di input.
scanf("%d %d", &n, &x);
v.resize(n);
for (i = 0; i < n; i++)
scanf("%d", &v[i]);Ordiniamo i prezzi dei prodotti in ordine non decrescente.
sort(v.begin(), v.end());Scorriamo le coppie di prodotti adiacenti e i + 1. Non appena v_i + v_{i+1} > x, il prodotto con prezzo v_{i+1} e tutti quelli successivi non possono più essere inclusi nella promozione.
res = n;
for (i = 0; i + 1 < n; i++)
if (v[i] + v[i + 1] > x)
{Allora il numero massimo di prodotti nella promozione è uguale a i + 1 (la numerazione inizia da zero).
res = i + 1;
break;
}Stampiamo la risposta.
printf("%d\n", res);