AtCoder Regular Contest 060 + AtCoder Beginner Contest 044
解法メモ
A問題
合計の宿泊費は、 ならば 円、 ならば 円。
B問題
はたかだか100文字なので、どの文字がいくつあるか先頭から順に数えていって、奇数個の文字がひとつでもあれば"No"、ひとつもなければ"Yes"を出力する。
C問題
動的計画法で解く。
を、 から までのカードから 個とって合計を にすることができるカードの取り方の総数とする。すると、
と漸化式が立てられる。カードの平均が となるような組み合わせの数は だから、これを出力する。
上とは別に、
D問題
のときは明らかに 。0 から までの数が各桁に使われるのは基数が 以上の場合に限られるし、基数が 以下のときに各桁の和が になることはない。
について愚直に を計算すると時間がかかってしまうので、よい方法を考える。
のとき、 の 進数表記は2桁以下になる ()。つまり、 進数表記が のとき、 と表される。これより、 である。また、 だから、 より となることがわかる。すなわち、 と の値から が一意に定まる。こうして定められた が を満たすかどうかを確認すればよい。
E問題
を、 番目のホテルから 日以内に到達できる最も右側のホテルの番号 として、まず を求め、次に として順次求めることができる。こうしてできたテーブルを二分探索すればよい。
二分探索を工夫する
しかし、C言語の二分探索関数は、値が見つからないとNULLを返してくるので、いちばん近い値を求めるには工夫がいる *1。
今回は自作の二分探索関数を作ることで対応した。要素の数が奇数のときは、見ている範囲の中央にある2つの要素両方を見て判定する工夫を施した。
Submission #860171 - AtCoder Regular Contest 060 | AtCoder
また、最右端まで到達できるときは、最右端の番号ではなくてそれより大きな番号を格納しておくと、「それより少ない日数で最右端に到達できる」ことがすぐにわかる。
F問題
まだよくわかっていない。