こんにちは, Shinoryoです.
今回は京セラプログラミングコンテスト2023(AtCoder Beginner Contest 305)を, Pythonで解いてみた結果を書き連ねていこうと思います.
KYOCERA Programming Contest 2023(AtCoder Beginner Contest 305) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
A - Water Station
スタート地点にある給水所を
Pythonでは組み込み関数round()
を用いることで, 四捨五入を行うことができます.
print(round(int(input()) / 5) * 5) |
あるいは, 正数に対する四捨五入は, 「
print(((int(input()) + 2) // 5) * 5) |
B - ABCDEFG
今回の実装方針は, 以下のようになります.
- 隣り合う点同士の距離を格納した配列
distance
を用意する. - 配列
distance
の 番目から 番目までのスライス,distance[i:j]
を取得する. と は, 入力したアルファベット , に応じて適切な値にする.
distance[i:j]
の合計を出力する.
# 入力 | |
p, q = input().split() | |
# 入力したアルファベットを数字に変換 | |
alphabet_list = "ABCDEFG" | |
p = alphabet_list.index(p) | |
q = alphabet_list.index(q) | |
# 距離配列のmin番目から(max-1)番目までの合計を出力 | |
distance = [3,1,4,1,5,9] | |
print(sum(distance[min(p, q):max(p, q)])) |
C - Snuke the Cookie Picker
#
の数の各行の行合計を考えてみます. すると, 「
# 入力 | |
H, W = list(map(int, input().split())) | |
S = [list(input()) for _ in range(H)] | |
# #の行合計・列合計を取得 | |
hash_count_H = [sum(S[i][j] == "#" for j in range(W)) for i in range(H)] | |
hash_count_W = [sum(S[i][j] == "#" for i in range(H)) for j in range(W)] | |
# #の行合計が、最大値よりも1少ない列が答えの行 | |
# 列に関しても同様 | |
hast_lack_H = hash_count_H.index(max(hash_count_H) - 1) | |
hast_lack_W = hash_count_W.index(max(hash_count_W) - 1) | |
print(hast_lack_H + 1, hast_lack_W + 1) |
D - Sleep Log
以下の関数
:睡眠記録を取り始めてから 分後までに何分寝たか
この関数
となる を探す. を以下の式によって求める:
なお,
import bisect | |
def func(x, A, A_accum): | |
x_index = bisect.bisect(A, x) | |
return A_accum[x_index - 1] + (A_accum[x_index] - A_accum[x_index - 1] > 0) * (x - A[x_index - 1]) | |
# 入力 | |
N = int(input()) | |
A = list(map(int, input().split())) | |
# A_accum[i] = f(A[i]) | |
# f(x):睡眠記録を取り始めてからx分後までに何分寝たか | |
A_accum = [0 for _ in range(N + 1)] | |
for i in range(1, N): | |
A_accum[i] = A_accum[i - 1] + (i % 2 == 0) * (A[i] - A[i - 1]) | |
A_accum[N] = A_accum[N - 1] | |
# 各クエリに対してループ | |
for _ in range(int(input())): | |
# l, rの入力 | |
l, r = map(int, input().split()) | |
# 求めるのは、f(r) - f(l) | |
print(func(r, A, A_accum) - func(l, A, A_accum)) |
E以降
E以降は私の能力不足故に省略いたします.
参考にしたサイト等
- 「解説 - 京セラプログラミングコンテスト2023(AtCoder Beginner Contest 305)」
Editorial - KYOCERA Programming Contest 2023(AtCoder Beginner Contest 305)
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
- Wakasugi Tatsuroh様による「Pythonで二分探索を行うライブラリ『bisect』」
Pythonで二分探索を行うライブラリ「bisect」 - Qiita
趣味で競プロをやるようにな り, Atcoderの問題を何問か解いているのだが, やっている内に覚えないといけないこともいくつかあるわけで. その内の一つに二分探索というアルゴリズムを使うという場面を多…
0 件のコメント:
コメントを投稿 (Please feel free to ask me about your questions! You can use Japanese or English in the comments.)