はじめに
この記事では、AtCoder Beginer Contest 165のA~F問題を解説します。
A - We Love Golf
https://atcoder.jp/contests/abc165/tasks/abc165_a
シミュレーションをすれば十分に間に合います。
1 | k = int(input()) |
B - 1%
https://atcoder.jp/contests/abc165/tasks/abc165_b
入力例2でXの上限である10**18に対する答えが3760とわかります。
預金額は単調増加するので、3760回以上ループを回せば十分です。
1 | X = int(input()) |
C - Many Requirements
https://atcoder.jp/contests/abc165/tasks/abc165_c
リストから要素を重複を許して選択し、新たなリストを作成します。ただし、新たなリストの各要素に対応する元リストのインデックス番号が単調増加するという条件を付けます。
これは深さ優先探索で解くことができますが、Pythonの場合はitertools.combinations_with_replacement
で直接求めることができます。
1 | import itertools |
D - Floor Function
https://atcoder.jp/contests/abc165/tasks/abc165_d
関数の値はxに対して周期Bで変化することが直感的に分かる。
そこでx=pB+qとおく。(q<B)
1 | floor(Ax/B) = pA+floor(Aq/B) |
となるので、元の関数は
1 | floor(Aq/B) |
となる。q<Bであるため、この関数はqに対して単調増加である。
よって、NとB-1のうち小さい値が答えとなる。
1 | A, B, N = map(int,input().split()) |
E - Rotation Matching
https://atcoder.jp/contests/abc165/tasks/abc165_e
(初期に割り当てられる)参加者番号の差分が1,2,3,4,..となるように対戦場に番号を割り振ることができれば制約を満たすことができる。
そのような割り振り方は、解説pdfの通りに参加者をM//2人のグループと(M+1)//2人の2つのグループに分ければよい。
1 | N, M = map(int, input().split()) |
F - LIS on Tree
https://atcoder.jp/contests/abc165/tasks/abc165_f
深さ優先探索とLISの組み合わせで解くことができます。
LISの基本については下記の問題で練習するのが良いでしょう。
ABC006D - トランプ挿入ソート
1 | import bisect |
関連記事
過去のABC解説記事です。
記事情報
- 投稿日:2020年5月2日
- 最終更新日:2020年5月3日