考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

2019-04-01から1ヶ月間の記事一覧

ABC050-B - Contest with Drinks Easy を解く

ABC050-B - Contest with Drinks Easy 入力もやたら多いし、問題文も読み解くのが難しい… サンプルにシミュレーションの例が書いてあるのでそれを見た方がよさそうだ … サンプルと合わせて見てなんとなくわかった N個の数列ががあり、その中の1つが変更され…

ABC049-B - たてなが / Thin を解く

ABC049-B - たてなが / Thin 画像を2倍縦長にしたものを出力する問題、と聞くと少し難しそうに思えるが 要するに各行を2回ずつ出力すればいいだけだ 以上を踏まえて書いたコードを以下に示す 提出したコード # 入力 H,W=map(int,input().split()) l=[] for i…

ABC048-B - Between a and b ... を解く

ABC048-B - Between a and b ... a 以上 b 以下の整数のうち、x で割り切れるものの個数を求める問題 a から b までの全ての整数について、x で割り切れるか確認していけば簡単なのだが 制約が 0 <= a <= b <= 10^18 なのでそれでは間に合わない… ここは数学…

ABC047-B - すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit) を解く

ABC047-B - すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit) 前回に引き続きまたも数学的な問題 結構難しそう… 書かれている通りシミュレーションができれば答えは求められそうだが どのようなプログラムを書けばいいのか想像がつきにくい 今…

ABC046-B - AtCoDeerくんとボール色塗り / Painting Balls with AtCoDeer を解く

ABC046-B - AtCoDeerくんとボール色塗り / Painting Balls with AtCoDeer なんだか数学的な問題が来た 難しそうだが、とりあえず具体的な数字で考えてみることにする たとえば、10個のボールを3色で塗り分ける場合 左端から塗っていくことを考えると、最初の…

ABC045-B - 3人でカードゲームイージー / Card Game for Three (ABC Edit) を解く

ABC045-B - 3人でカードゲームイージー / Card Game for Three (ABC Edit) 問題文の通りシミュレーションするコードを書けばよさそうだ 出力例1を見るとどんな感じに処理が行われるかがわかりやすい また、持っているカードが全てなくなった時点で勝ちとなる…

ABC044-B - 美しい文字列 / Beautiful Strings を解く

ABC044-B - 美しい文字列 / Beautiful Strings 'a' 〜 'z' からなる文字列 w が与えられる どの文字も偶数回登場する場合は 'Yes' を、そうでないなら 'No' を出力する問題 ・'a' は偶数個あるか? ・'b' は偶数個あるか? … ・'z' は偶数個あるか? という…

ABC043-B - バイナリハックイージー / Unhappy Hacking (ABC Edit) を解く

ABC043-B - バイナリハックイージー / Unhappy Hacking (ABC Edit) '0', '1', 'B' の3種類からなる文字列 s が与えられ 左端から1文字ずつ見ていって、空文字列に対して以下の処理を行っていく ・'0'の場合: 文字列の右端に文字0を挿入 ・'1'の場合: 文字列…

ABC042-B - 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition) を解く

ABC042-B - 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition) N個の文字列が与えられるので それらを辞書順で最小になるように連結する問題 list の sort メソッドを使用すれば 文字列を辞書順で小さい順にソートすることができる こ…

ABC041-B - 直方体 を解く

ABC041-B - 直方体 Python やっててよかったー!と思える問題 多倍長整数が使える Python なら指示された通りに書けば大丈夫 提出したコード # 入力 A,B,C=map(int,input().split()) # 出力 print(A*B*C%1000000007) 提出結果はACでした

ABC040-B - □□□□□ を解く

ABC040-B - □□□□□ 今回は少し難しそうだ N枚のタイルをできる限り余らせずに、正方形寄りの長方形を作る問題 厳密には 「長方形の縦と横の長さの差の絶対値と、余ったタイルの枚数の和の最小」 を求める必要がある とりあえず手当たり次第に長方形を作って、…

ABC039-B - エージェント高橋君 を解く

ABC039-B - エージェント高橋君 4乗された数が与えられるので 元の数を求めよという問題 ルート2回とるだけじゃん。流石に簡単すぎる 提出したコード import math print(int(math.sqrt(math.sqrt(int(input()))))) 提出結果はACでした

ABC038-B - ディスプレイ を解く

ABC038-B - ディスプレイ 2枚のディスプレイの高さを合わせて並べることができるかを判定する問題 縦置き・横置きのどちらも可能であるという点がポイント 2枚のディスプレイの高さ・幅がそれぞれ H1 W1 H2 W2 の形式で与えられるので 縦置き・横置きなどを…

ABC037-B - 編集 を解く

ABC037-B - 編集 言われた通りに実装すれば解ける問題 制約も緩いので工夫する必要はない 提出したコード # 入力 N,Q=map(int,input().split()) l=[0]*N for i in range(Q): L,R,T=map(int,input().split()) for j in range(L-1,R): l[j]=T # 出力 for i in …

ABC036-B - 回転 を解く

ABC036-B - 回転 N × N のマス目を90度右に倒すだけ 手動でやるなら極めて簡単な処理だ しかしプログラムでやるとなるとどうしたものか…? ここは座標を使って考えてみたいと思う 左上最初の文字がある場所を (0, 0) とし、その右隣を (0, 1) 左上の上から2…

ABC035-B - ドローン を解く

ABC035-B - ドローン なんか色々小難しそうな説明しているけれど 多分単純な問題だろう 'U', 'D', 'L', 'R', '?' からなる文字列Sが与えられる 原点 (0,0) スタートで 'U' なら上、 'D' なら下、 'L' なら左、 'R' なら右に移動 '?' の場合は 'U', 'D', 'L',…

ABC034-B - ペア を解く

ABC034-B - ペア 10^9 人の人がおり、1と2、3と4、5と6、… といった感じで前からペアを作っていく 入力された数字とペアになる相手の数字を出力するという問題 一見、かなり簡単そうである 1 だったら 2 が答え 9 だったら 10 が答え 簡単だ。 じゃあ 123456…

ABC033-B - 町の合併 を解く

ABC033-B - 町の合併 文字列 s と 数字 p の組み合わせが N 個与えられる その中で数字 p の合計の過半数以上のものが存在するならば その組み合わせの s を出力、存在しないならば 'atcoder' と出力する問題 もし、過半数以上の数字 p が存在するならば そ…

ABC032-B - 高橋君とパスワード を解く

ABC032-B - 高橋君とパスワード 文字列 s と長さ k が与えられるので 文字列 s から長さ k の(連続する)部分文字列は何通りあるか答える問題 s の長さは300以下と、緩い制約なので全部列挙してしまおう 最後に重複を取り除いて、個数を数えればいい 重複除…

ABC031-B - 運動管理 を解く

ABC031-B - 運動管理 まず下限と上限の基準値が与えられ、N個の数字について ・基準内の場合は "0" を ・下限を下回る場合は下限に届くまでに必要な値を ・上限を上回る場合は "-1" を 出力する 何も考えず上記を満たすコードを書けばいい 提出したコード # …

ABC030-B - 時計盤 を解く

ABC030-B - 時計盤 時刻が与えられるので、その時間における アナログ時計の短針と長針がなす角度を答える問題 時計の12時方向を0度とし 短針の角度と長針の角度をそれぞれ求め、 それぞれの角度をの差を求めることで短針と長針のなす角を求めることができる…

ABC029-B - カキ を解く

ABC029-B - カキ 12個の文字列が与えられるので "r" が含まれる文字列がいくつ存在するかを数える問題 以下のように、in を使用することで 文字列が含まれるか否かを判定することができる >>> 'r' in 'march' True >>> 's' in 'march' False これを利用して …

ABC028-B - 文字数カウント を解く

ABC028-B - 文字数カウント 与えられた文字列内に含まれる 'A', 'B', 'C', 'D', 'E', 'F' の個数を数えて出力する問題 制約は S(1≦|S|≦100) と小さいので 各文字毎に count 関数を使ってサクッと解いてしまおう 提出したコード # 入力 S=input() l=[] # 'A'…

ABC027-B - 島と橋 を解く

ABC027-B - 島と橋 N個の横一列に並んだ島があり、各島にいる人の数が与えられる 各島間に橋を渡して自由に人を行き来させることができるとき、 すべての島の人数を同じにするには最低いくつの橋が必要かを求める問題だ すべての島の人数が同じになる、とい…

ABC026-B - N重丸 を解く

ABC026-B - N重丸 N重丸が外側から赤、白、赤、白、… と塗り分けられているので 赤い部分の面積を求めよという問題 一番外が赤であることから、一番外の円の面積を求め、 その一つ内にある円の面積を引き、 さらにその一つ内にある円の面積を足し、 さらに一…

ABC025-B - 双子とスイカ割り を解く

ABC025-B - 双子とスイカ割り ちょっと問題文を理解するのが難しい… 以下の部分が重要っぽい ・di<A のとき、直大くんは向いている方向に A メートル進む。 ・A≦di≦B のとき、直大くんは向いている方向に di メートル進む。 ・di>B のとき、直大くんは向い…

ABC024-B - 自動ドア を解く

ABC024-B - 自動ドア 自動ドアが開いている時間を求める問題 センサー反応後に開き続けている時間と、人が通る時間が 入力値として与えられる 注意しなければならないのは、人が通る時間の間隔だろう 例えば、10秒間開き続ける自動ドアの場合を考える 0秒後…

ABC023-B - 手芸王 を解く

ABC023-B - 手芸王 b abc cabca bcabcab abcabcabc cabcabcabca bcabcabcabcab … といった感じで文字列が作られていくとき 与えられた文字列が存在するかどうかを判定する問題 文字列の長さNの制約は 1≦N≦100 と小さいので 上記の手順をシミュレーションして…

ABC022-B - Bumble Bee を解く(2)

ABC022-B - Bumble Bee を解く(1) の続き 提出したコードは TLE になってしまった なぜ TLE になったのか? # (種類ごとの数 -1)をカウント c=0 for x in setl: c+=l.count(x)-1 おそらく for 文中で count 関数を呼び出しているためだと思われるcount はリ…

ABC022-B - Bumble Bee を解く(1)

ABC022-B - Bumble Bee 蜂による花の受粉になぞらえた問題 少し入力例と出力例を見てみよう 入力例 512321 出力例 2 入力例の "2" と "1" は2回目の出現 このように出現が2回目以降の数字が出てくる度に それをカウントしていけばいいようだ もちろん2回目だ…