Ürünlerin fiyatlarını azalmayan sırada sıralayalım. Aksiyona c_1 \le c_2 \le ... \le c_k fiyatlı ürünler katılsın. Alıcı için en kazançlısı bunların en pahalı ikisini — c_{k−1} ve c_k — satın almaktır. Eğer c_{k−1} + c_k > x ise, hediye olarak tek boynuzlu at boynuzu alacaktır.
a_1, a_2, ..., a_n — tüm ürünün sıralanmış fiyatları olsun. O zaman aksiyona a_1, a_2, ..., a_k fiyatlı ürünler dahil edilmelidir, burada — a_{k−1} + a_k \le x koşulunu sağlayan en büyük indekstir.
Örnek
Birinci örnekte sıralanmış fiyatlar: \{1, 2, 3, 4, 5\}. x = 6 olduğundan, a_{k−1} + a_k \le 6 koşulunu sağlayan en büyük indeksini arıyoruz. Bu k = 3'tür, çünkü 2 + 3 \le 6, ama 3 + 4 > 6.
İkinci örnekte sıralanmış fiyatlar: \{1, 4, 7, 8, 9\}. x = 10 olduğundan, en büyük indeksi 'dir: 1 + 4 \le 10, ama 4 + 7 > 10.
Algoritmanın Gerçeklenmesi
Giriş verilerini okuyoruz.
scanf("%d %d", &n, &x);
v.resize(n);
for (i = 0; i < n; i++)
scanf("%d", &v[i]);Ürünlerin fiyatlarını azalmayan sırada sıralıyoruz.
sort(v.begin(), v.end());ve i + 1 komşu ürün çiftlerini geziyoruz. v_i + v_{i+1} > x olur olmaz, v_{i+1} fiyatlı ürün ve ondan sonraki tüm ürünler artık aksiyona dahil edilemez.
res = n;
for (i = 0; i + 1 < n; i++)
if (v[i] + v[i + 1] > x)
{O zaman aksiyondaki maksimum ürün sayısı i + 1'e eşittir (numaralandırma sıfırdan başlar).
res = i + 1;
break;
}Cevabı yazdırıyoruz.
printf("%d\n", res);