メルカリ競プロコンテスト2024
A問題
問題
メル君は使わなくなったスマホをメルカリで出品しようとしています。 メル君は、販売中のどのスマホよりも安く、売り切れのどのスマホよりも高い値段で出品しようと考えています。
メルカリにはスマホが 個出品されており、それぞれ から までの番号が割り当てられています。
番目のスマホの値段 と、販売状況を表す文字列 が与えられます。 が sold_out
ならそのスマホが売り切れであることを表し、on_sale
ならそのスマホが販売中であることを表します。
メルくんが決めた値段 が、以下の条件を満たすかを判定してください。
条件:全ての整数 について
- が
on_sale
なら - が
sold_out
なら
解答
on_sale
の最小値とsold_out
の最大値を求めて条件を確認するとよいです。C++だと std::min_element
や std::max_element
を使うと楽です。
B問題
問題
メルカリには、ユーザー からユーザー までの 人のユーザーがいます。また、メルカリには、商品 から商品 までの 個の商品が つずつ出品されています。
はじめ、すべてのユーザーの幸福度は です。
次のような形式の情報が 個与えられます。 番目の情報は以下の通りです。
- ユーザー が商品 を購入すると、そのユーザーの幸福度が 上昇する。
ユーザーが 個の情報にない方法で商品を購入することはできません。すべてのユーザーの幸福度の合計が最大となるような購入方法を求めてください。 購入方法とは、商品 がユーザー によって購入されることを表す情報 の集合です。ただし、 つの商品は一度のみ購入することができます。
なお、与えられる入力では、幸福度の合計が最大となる購入方法が一意に定まることが保証されています。
解答
ユーザーは何個でも商品を買えるので、各商品に対して買われたときに幸福度が最も上昇するユーザーを求めればよいです。map
で各商品の幸福度を管理すると楽です。
C問題
問題
高さ cm、幅 cmのディスプレイがあります。このディスプレイ内を点が動くスクリーンセーバーを開発しました。ディスプレイの左下の座標を とし、ディスプレイの左下から右に cm、上に cm移動した点の座標を と表します。
時刻 秒に点は にあります。はじめ、点は から 方向に秒速 cmで真っすぐ進み出します。そして、この点は普通の光と同じように真っすぐ進み、画面端に到達すると同じ速度で反射します。
初期座標 が与えられるので時刻 秒での点の座標を求めてください。
解答
成分と 成分は独立に考えられます。 成分で考えると、往復しているようになっているので を で割ったあまりを求めるとよいです。( より大きい場合は、 から引きましょう)
D問題
問題
メルカリには 個のレアシューズが存在し、 番目 のレアシューズは、時刻 に出品され、時刻 に出品が終了します。 また、 人のユーザーがレアシューズを購入しようとしています。 番目 のユーザーは、時刻 にレアシューズを購入することを希望しており、 を満たすとき、 番目のレアシューズを購入することができます。ただし、各ユーザーは つしかレアシューズを購入せず、購入されたレアシューズは他のユーザーが購入することはできなくなります。
各レアシューズをどのユーザーが購入するかを自由に選択できるとき、 最大で何人のユーザーがレアシューズを購入できるかを求めてください。
解答
をが小さい順にソートしておきます。
が小さいものから、 を満たす全ての に対して、 multiset
や priority_queue
に を突っ込んでシミュレーションします。この際、を満たす が存在しない場合は購入せず、存在する場合は条件を満たす最小の を選ぶことで、最適解を達成できます。
E問題以降
まだ見てません