yukicoder
問題 問題概要 優先順位のつけ方が与えられる。どの順番に選ばえばいいか。 解法 priority_queueで解いた。大学ごとに何人選ばれたかが優先順位をつける要因となるので、はじめの状態でそれぞれの大学が何人ずつ選ばれるかがわからないので、いきなりすべて…
問題 問題概要 隣りあったの数字をたす。足した値が2桁になるときは10の位と1の位の数字をたす。1桁ならそのまま。この操作を続けていき、さいご1桁になった時、どのような数字になるかを求める。 解法 与えられう数字Sの桁は大きいので文字列として受け取る…
問題 問題概要 死亡フラグと生存フラグが与えられる。死亡フラグが2本以上立っていれば、死亡。しかし、生存フラグが立っていれば、死亡フラグによらず生存している。どのような状態か求めよ。 解法 死亡フラグが何本立っているかをd1+d2+d3で求められる。あ…
問題 問題概要 椅子に隣同士に座ることはできない。一つに机に椅子がいくつある椅子が、何個あるかが与えられるので、最大で何人座ることができるかを求める。 解法 2人掛けなら1人、3人掛けなら2人、4人掛けなら2人、5人掛けなら3人が最大で座れる数となる…
問題 問題概要 手持ちのモンスターから、レベルの一番低くくて、その中でも、一番先頭回数が少ないモンスターから使う。モンスターは戦わせるとレベルが上がる。敵は円に並んでいる。どこから始めてもよいが、1回ずつ順番に戦う。このときに、最も先頭回数が…
問題 問題概要 省略 解法 bfsで書いた。やることはシンプルで、色を変えた場所から隣接している同じ色だった部分の色も同時に変わるので、そのようなマスをbfsで探索して色を変えていけばいい。これを実装すると、O(HWQ)となり、TLEしてしまう。ここをどう…
問題 問題概要 N個の寿司が並んでいる。順番に食べていくが、連続して食べることはできない。寿司にはおいしさがそれぞれ決まっている。食べた寿司のおいしさの合計の最大値を求めよ。またどの寿司を食べたかも求める。経路復元。 解法 動的計画法で解く。dp…
問題 問題概要 SをTにするときの編集距離の最小を求める問題。編集距離のdpの漸化式については以下のサイトが参考になる。 解法 dpで解くことができる。 dp[i][j] := 文字列Sのi番目までで、文字列Tのj番目までを作ることを考えた時の操作回数の最小値として…
問題 問題概要 a,b,cのどれかの倍数になる数字の個数を求める。 解法 包徐原理で解く。高1のどっかでやる3つの場合の公式を使えば解くことができる。 wikipediaの3つの有限集合に対して書かれている公式をそのまま使えばいい。 包除原理 - Wikipedia 集合a,…
問題 問題概要 円の中心座標が与えられる。円の半径は10cm。いくつの円をかなさならないようにおけるか。 解法 まず、Nが105なので、円の中心が与えられてるたびに、過去に置いた円すべての中心間の距離を計算しておけるかどうかを確かめるとO(N*N)となり、…
問題 問題概要 文字列sの中に文字列cがいくつ含まれているかを求める問題。 解法 ローリングハッシュを使いました。ほぼ理解していないので、応用はきかないので要練習。文字列を比較するとき、1文字ずつ見比べいると、文字列の長さがmだとそこで、O(m)なっ…
問題 問題概要 数列をswapしていく。k回swapするが、k-1回文のswapの処理は与えられるが、どこか一か所のswapの処理がわからないようになっている。一番初めの数列の状態と、最後の数列の状態が与えられるので、途中一か所わからないswapの処理がどのような…
問題 問題概要 0.(190桁)のような少数が与えらえる。これをn倍した値を求める。 解法 小数点以下が多くある状態で扱ってるとまずいので、全体を整数で扱うことにした。Dを整数としてあつかい、それに与えられたnをかける。あとは、これをDを整数にするために…
問題 問題概要 与えられた数字が3:4なのか4:3なのかを判別する問題。 解法 最大公約数で割って、考えた。 ミス 4:3か3:4しかないから、大小だけみれば十分なのか。 コード #include <iostream> #include <algorithm> #include <vector> #include <cstdio> using namespace std; typedef long long </cstdio></vector></algorithm></iostream>…
問題 問題概要 省略 解法 2次元imos法を使えば楽なんですね。 imos法 いもす法 - いもす研 (imos laboratory) BITとかsegtree使うのかな、て感じだった。 2次元BIT http://hos.ac/slides/20140319_bit.pdf ミス imos!! コード 2次元imos法 #include <iostream> #includ</iostream>…
問題 問題概要 組み合わせの数え上げ 解法 まず、すべてソートしてく。全探索をして、それぞれの家族がどのマットを使うかを決める。それが条件を満たしたものであれば、ほかのものは選ぶ選ばないの選択がある。 dpのほうがわかりやすいな。状態数は2つで、1…
問題 問題概要 LからRの範囲の中の素数が与えら数の数字(0~9)のみを使い(必ず使わないといけない)、R - Lの最大値を求めよ。 解法 素数判定はエラトステネスを利用、区間の最大値を求めるには、1~5000000までの素数でも、10000以上あるので、すべての区間を…
問題 問題概要 省略 解法 union findは辺を削除することができない。問題は、クエリを与えられた順にみると、辺を削除するような形だが、クエリを逆からみれば、辺をつなげていく形になる。このようになると、union findで管理できる。 また今回学んだunion …
問題 問題概要 省略 解法 bitDPで解いた。 dp[mask][lim] := 集合maskのモンスターと戦った時に最大体力が lim * 100 の時に、残りの体力の最大値 として、ループで回していった。 limは100から100とばしに1600までしか使わないので、簡単な座圧的な感じで、…
問題 問題概要 省略 解法 メモ化再帰で解いた。サンプルで与えられている図のように辺を張り、dp[i] := i番目の商品が必要な数 とおき、自分の子で必要なものの数から、i番目に必要な個数を計算する形にした。商品nが必要な個数は1個なので、dp[n - 1] = 1と…
問題 問題概要 省略 解法 それぞれの箱にいれる数を決めると、作業の回数が決まる。求めるものは作業回数の最小値。すこし考えると、仮にそれぞれの箱にx個入れた時が答えとなるとすると、x個以下でそろえようとしたときは、作業回数は増え、またx個以上でそ…
問題 問題概要 省略 解法 与えられた関数は、下に凸の関数となるので、最小値は3分探索で探すことができる。 ミス よくわからんけど、rの大きさが大きすぎて、バグらした、3分探索を練習したい。 コード #include <iostream> #include <cstdio> #include <set> #include <vector> #include <algorithm> </algorithm></vector></set></cstdio></iostream>…
問題 問題概要 トーナメントで勝ち進んでいく確率。 解法 dpで解いた。 dp[i][j] := i回回目の試合にj番目のひとが勝つ確率 として、漸化式にそって、ループで値を埋めていく。漸化式は簡単で、 dp[i + 1][x] += dp[i][x] * dp[i][y] * memo[x][y] のように…
問題 問題概要 省略 解法 dpで解いた。 dp1[i][j] := 太郎君がサイコロをi回振って、合計がjの時の確率 dp2[i][j] := 次郎君がサイコロをi回振って、合計がjの時の確率 とおいて、漸化式でi=1からi=nまでループを回して埋めていった。 漸化式は単純で、いか…
問題 問題概要 省略 解法 bfsで解いた。よくある、2次元座標上での迷路問題などで、ゴールまで行けるかの問題と同じようにやる。ただし、4方向への移動が高さの条件で制限されるので、それを確認すればよい。また、dyとdxを2倍して、2倍の距離の移動も同様に…
問題 問題概要 省略 解法 2進数で表したときに、2倍すると、1桁左に移動するので、末尾に0をつければよい。すなわち、hamをつければいい。 ex1) 101(5) 1010(10) ex2) 111(7) 1110(14) 注意しなければならないのは、n=hamの時0なので、2倍しても0のまま。 ミ…
問題 問題概要 省略 解法 bfsで解いた。進める方向は、進もうとするマスと、現在のマスと過去のマスの3つが門松列をなしているとき。注意しなければならないのは、基本的な最短経路問題で使うbfsのように、座標のみを状態として最短距離をメモしていくと、解…
問題 問題概要 省略 解法 がんばって実装しよう。 ミス なし。 コード #include <iostream> #include <cstdio> #include <set> #include <vector> #include <algorithm> using namespace std; typedef long long ll; #define rep(i,n) for(int i=0;i<(n);i++) int n, m; int main(void){ cin >> n >> m;</algorithm></vector></set></cstdio></iostream>…
問題 問題概要 省略 解法 2部マッチングでできるのか、て感じ。公式解説を見ればわかる。実装はs,tを追加して、最大フローを求める感じで書いたもの。 ミス 制約が小さければ、bitDPでもできるぽい。グラフ問題に落とせるようにしたい。 コード #include <iostream> #i</iostream>…
問題 問題概要 省略 解法 まず、1つ分で、どこからスタートしたら、どこに到達するかをメモしておき、そのあと、すべてのスタート時点に対して、何回で同じ位置に戻ってくるかを計算し、それらの最小公倍数を求めれば、答えとなる。 ミス なし。 コード #inc…