Kimsenin Kazanamayacağı Ödül#9878

Kimsenin Kazanamayacağı Ödül (Editoryal)

Ü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);