COLOCON -Colopl programming contest 2018- C すぬけそだて――ごはん――
https://beta.atcoder.jp/contests/colopl2018-qual/tasks/colopl2018_qual_c
問題概要
以上 以下の整数を0個以上選ぶ。
選んだ整数のうちすべての整数が互いに素であるように選ぶとき、何通りの選び方があるか。
制約
解法
より、それぞれの整数が35以下のどの素数を素因数に持つかについて考えればよい。
35以下の素数の数は11個しかないので、bitで情報を持つことができる。
dp[ ][ ] := 番目の整数までみて、選んだ整数の素因数の状態が であるときの場合の数
というDP配列をつくればよい。
計算量は ( は 以下の素数の数) になり十分間に合う。
(解説には全探索って書いてあったけどよくわからなかった)
Submission #2006870 - COLOCON -Colopl programming contest 2018-
Submission #2006886 - COLOCON -Colopl programming contest 2018-
(↑bit演算使ったら簡潔なコードがかけるよって教えてもらった)
ABC065/ARC076 D Built?
問題概要
個の街があり、 番目の街は座標 にある。
座標 にある街と座標 にある街の間に道をつくるのに、コストが 円かかる。
任意の2つの街の間を道を通って行き来できるようにするための最低コストを求めよ。
制約
CODE FESTIVAL 2017 Final B Palindrome-phobia
問題概要
'a', 'b', 'c' の3種類の文字からなる文字列 が与えられる。
文字列 を自由に並び替えて、部分文字列に2文字以上の回文を含まないようにできるかどうか判定せよ。
制約
解法
2文字以上の回文が含まれないとき、並べ替えた文字列は
…abcabcabc…
または
…acbacbacb…
のどちらかになる。
なので、各文字が含まれる個数を計算し、最も多く含まれる文字の文字数と最も少なく含まれる文字の文字数の差が1以下であるかを調べればよい。
DDCC2016 予選 C ロト2
問題概要
個の整数があり、 番目の整数は である。
が の倍数となるような と の組み合わせ が何通りあるか求めよ。
制約
解法
積が の倍数になればいいのだから、 それぞれの において必要な情報は、 の約数のうちどれが含まれているか。
よって、それぞれの について、 を求める。
あとはそれらを2つかけて の倍数にできるかを判定して数え上げればいい。
ってことまで自力で思いついて、具体的な方法が思い浮かばなかった。ので解説を見た。
だから、 の約数の個数は高々1500個くらいらしい。よって、連想配列か何かに を記録していって、2重ループで全探索すれば良い。
連想配列は滅多に使わないので、範囲forというものを初めて知った。
範囲for文 - cpprefjp C++日本語リファレンス
AGC013 Hamiltonish Path
問題概要
頂点 辺の、連結な単純無向グラフが与えられる。 頂点には から までの番号がついており、辺には から までの番号がついている。 辺 は、頂点 と頂点 を結んでいる。 次の条件を満たすパスを つ見つけて出力する(あり得る答えのうちどれを出力しても良い)。
- 2個以上の頂点を通る
- 同じ頂点を2度以上通らない
- パスの少なくとも一方の端点と直接辺で結ばれている頂点は必ずパスに含まれる
制約
解法
条件3の「パスの少なくとも一方の端点と直接辺で結ばれている頂点は必ずパスに含まれる」が具体的にどういうことかについて考えてみる。
パスの少なくとも一方の端点と直接辺で結ばれている頂点がパスに含まれていないという状態は、パスの端点からその頂点に対して、パスを伸ばすことができるということを意味する。つまり、条件3が言いたいことは、あるパスがあったときに、条件2を満たした上で、そのパスをできるだけ長く伸ばしたものを出力しないといけないということ。
よって解法の方針は
- 好きな頂点を選んで、そこから辿れる頂点をパスに含まれる頂点として配列などに入れておき、辿れなくなったら順に出力する
となる。
計算量は、各頂点についてパスの端点として追加される回数が高々1回であり、端点から辺で結ばれている頂点がパスに含まれているかを調べるので、 。
ABC080 D Recording
問題概要
個のテレビ番組を録画したい。
テレビが受信できるチャンネルが 個あり、1から までの番号がついている。
録画したいテレビ番組のうち、 個目のテレビ番組は、時刻 から時刻 までチャンネル で放送される(時刻 を含み時刻 を含まない)。同じチャンネルで複数のテレビ番組が同時に放送されることはない。
また、録画機は、あるチャンネルの時刻 から時刻 までを録画するとき、時刻 から時刻 までの間、他のチャンネルの録画に使うことができない(ただし時刻 を含み時刻 を含まない)。
必要な録画機の最小個数を求めよ。
制約
解法
はじめは と を無視してimos法したら解けるんじゃないかと思ったけど、2ケースWA。
いろいろ考えてるうちに、
2 1
1 2 1
2 3 1
のケースでダメなことがわかる。
この例でいくと、時刻1から時刻3までを録画したいから、時刻0.5から時刻3までを1つの録画機で録画したいけど、「時刻0.5から時刻2」「時刻1.5から時刻3」の2つを録画することになって、2個の録画機が必要という答えが出てしまう。
つまりチャンネルの情報は不要じゃなかった。
ということで、
v[ ][ ] := チャンネル で時刻 に録画機を使う
という配列を作って、各チャンネルでimos法をする。
このときは、開始時刻を ではなく と考えてimos法をして、あとから録画開始時刻を1だけ早める(これで、同じチャンネルで連続して録画するときに重複をなくせる)。
あとは各時刻について、いくつのチャンネルで録画機が必要かを計算する。
計算量は 。
ABC076 D AtCoder Express
小数きらい
問題概要
次のような列車を運行する。
- 走行開始時と走行終了時には列車は止まっていなければならない。
- 列車の走行時間は 秒である。
- 最初の 秒間は列車は速度 以内で走行しなければならない。また次の 秒間は列車は速度 以内で走行しなければならない。次の 秒間、またそれ以降も同様である。
- 最後の 秒間は列車は速度 以内で走行しなければならない。
- 列車の性能上、加速度は 以内でなければならない。
このとき、列車が発車してから停車するまでに走れる最大の距離を求める。
制約
解法
- 累積和をとって、発車時刻を0としたときの各区間の最初の時刻と最後の時刻を求めておく
- 各時刻における最大速度を計算する(速度が大きいほど走行距離が長くなるので)
- 総和を計算して出力する
各時刻における最大速度を計算するのが面倒で、
- 「速度は ずつしか増やせないけど、速度を落とすのは一瞬」というルールでの各時刻における最大速度
- 「速度を落とすのは ずつだけど、速度を上げるのは一瞬」というルールでの各時刻における最大速度
を計算し、minをとればよい。
また、入力例4からわかるとおり、1秒きざみではうまくいかないので、最大速度を0.5秒きざみで考える必要がある。