投稿者 NOSS | 2019-04-03
2019/4/3に行われた部内コンテストの解説です。
コンテストのリンク(https://onlinejudge.u-aizu.ac.jp/beta/room.html#YNUCPC_046)
A問題
https://onlinejudge.u-aizu.ac.jp/problems/0019
概要
の階乗を求めよ。
解説
ループ文を使って から順にかけていけばよいです。 が大きいと32bit整数に収まらないのでlong long int
を使うことに注意してください。
B問題
https://onlinejudge.u-aizu.ac.jp/problems/0130
概要
列車の巡回記録が与えられる。列車の編成を求めよ。
解説
車掌の移動のシミュレーションができればこの問題は解くことができます。
方法としては車掌の現在位置を保持しておき、まだ訪れていない車両に移動しときにはそこに新たな車両を追加します。車両は列車の先頭と末尾の両方に追加される可能性があることに注意します。
c++では
- list
- deque
- 十分に長い配列
などを使って実装できます。
C問題
https://onlinejudge.u-aizu.ac.jp/problems/3028
概要
個のボールがあり、各ボールには色と価値が決められている。色は色 から色 まで 種類あり、色 のボールは まで選ぶことができる。全体でボールを高々 個まで選ぶとき、得られる価値の合計の最大値を求めよ。
解説
ボールは貪欲に価値の大きいものから選ぶのが最適です。よって価値の大きさでソートしておき、大きいものから選択していけばよいです。ただし、色の個数制限でとれないものはスキップします。
計算量は です。
D問題
https://onlinejudge.u-aizu.ac.jp/problems/0348
概要
から までの数が書かれた 枚のカードを使って「7並べ」をします。対戦は2人で行い、初期手札は 枚ずつで行います。
お互いが最適に行動したとき先手が勝利できるか判定せよ。
解説
まず、勝利したときの状態を考えてみます。手札がすべて場に置かれているはずなので手札のうち最小の数を 最大の数を とすると、少なくとも から までのすべての数が場に出ていることになります。すなわち勝利条件は、「場に出ている数の最小値が 以下かつ最大値が 以上」と言えます。この条件を先に満たしたほうが勝者です。
次にゲームの状態としてどのようなパターンが有り得るのか考えます。場に出せるカードは連続でないといけないので「 以上 以下のすべての数が出ていてそれ以外は出ていない」という風に表すことができます。つまり区間的に表せます。
ゲームの状態を表すためには
- 場の最小値
- 場の最大値
- 手番はどちらか
という情報があればよいです。これでゲームの状態を完全に再現できます。
ゲーム状態が一致すればそこから最適に行動したときの結果ももちろん一致します。このゲームのパターンの総数は十分小さいので網羅することが可能です。あとは現在の状態から勝利できる状態へ遷移できるかを探索していけばよいです。
よってメモ化再帰によってこの問題は解くことができます。
手番が (先手/後手を01で表す) で場の数が 以上 以下のとき勝利できるか、とします。
遷移は左に置く場合は 、右に置く場合は になります。遷移先に自分が勝利できる状態があればそれを選べばいいので勝利、そうでない場合は負けと決まります。最終的に求める値は です。
E問題
https://onlinejudge.u-aizu.ac.jp/problems/0648
概要
点の美術品があり、 番目の美術品の大きさは 、価値は である。これらの中からいくつかの美術品を選び、それらの大きさの最大値を 、最小値を 、価値の合計を とする。このとき を最大化せよ。
解説
と が固定されているとします。すると大きさが であるような美術品はすべて選ぶのが最適であることがわかります。なので美術品を でソートしておき、価値の累積和をとっておくことで を高速に求められるようになります。以後、美術品は で昇順にソートされているとします。
番目までの美術品の価値の総和、とします。
これを用いて式を変形すると として次のようになります。
式を と の式に分離することができました。
の形をしているので を最大化しつつ を最小化すればよさそうです。ここで を固定すれば は より 以下で が最小のものを選べばよいです。
以上より、 を から順に見ていき、そのたび選ぶべき を更新していけば各 について最適解が得られます。これらの中の最大値が答えになります。この計算量は です。
全体の計算量はソートがボトルネックになり になります。
F問題
https://onlinejudge.u-aizu.ac.jp/problems/2608
概要
頂点 辺の連結な無向グラフが与えられる。頂点 間に辺を追加したとき から への最短経路の長さが だけ小さくなるような の組の個数を求めよ。
解説
辺を追加して最短経路が短くなるということは新たな最短経路は必ず辺 を通るはずです。すなわち経路は となるはずです。ここで は距離 ですから元の最短経路の長さを とすると と の距離の和は であれば条件を満たします。 の距離を から順に変化させれば求めるべき組の個数は次のように表せます。
ある始点からの最短距離はダイクストラ法で求めることができるのでこの問題を解くことができます。
計算量は です。
コメント
新入生の方が1人見学に来てくれました。次回の活動からは新歓の本番になるので競プロの魅力をうまく伝えられたらなと思います。