予算内で選ぶ 2 つの商品

  • 並べ替えと貪欲
  • 問題 10
  • ふつう
  • 目安 31 分

商品の値段の一覧から 2 つを選び、合計が予算以内でいちばん高くなる組を探す。全部の組を試さず、並べ替えと両端からの探索で答える練習です。

本番の試験は PC で受けることが多いので、PC での練習をすすめます。スマホでも、読んで、書いて、採点するところまで動きます。

入力は標準入力から読み、答えは標準出力に書きます。1 テストあたり 2 秒までです。

問題

取引先への贈り物として、店の N 個の商品から異なる 2 個を選びます。2 個の値段の合計は予算 B 円以下にしなければなりません。その中で、合計ができるだけ高くなるように選んだときの合計の金額を出力してください。予算 B 円以下になる選び方が 1 つも無いときは -1 を出力してください。

同じ値段の商品が複数あることもあります。値段が同じでも別の商品なら、その 2 個を選んでかまいません。

入力の形式

N B
p_1 p_2 ... p_N

1 行目に商品の数 N と予算 B、2 行目に N 個の商品の値段 p_i が半角の空白 1 つで区切られて並びます。値段は並べ替えられていません。

出力の形式

答えの金額 (選べないときは -1) を 1 行に出力します。

制約

  • N は 2 以上 200000 以下です
  • 予算 B は 1 以上 2000000000 以下の整数です
  • 値段 p_i は 1 以上 1000000000 以下の整数です

入力と出力の例

例 1

予算は 1000 円です。800 円と 300 円は合計 1100 円で予算を越えます。450 円と 500 円の合計 950 円が、予算以内でいちばん高い組です。

入力

5 1000
300 800 450 120 500

出力

950

例 2

どの 2 個を選んでも予算 500 円を越えるときです。

入力

3 500
400 300 250

出力

-1

例 3

同じ 300 円の商品が 2 個あり、合計がちょうど予算の 600 円になります。予算ちょうどは選べます。

入力

4 600
300 700 300 100

出力

600

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

main.py
import sys

data = sys.stdin.read().split()
n, budget = int(data[0]), int(data[1])
prices = list(map(int, data[2:2 + n]))

# ここから書く

入力

出力

「実行する」を押すと、ここに出力が出ます

できているか「提出して採点」を押すと、隠れたテストを全部走らせて、通ったかをここに出します