はじめに
- python初心者+Atcoder初心者です。解いた(+解説集等を参考に学習した)問題を投稿させていただきます。
- アドバイス等あれば、是非お願いいたします。
AtCoder Biginner Contest 258問題リンク
A - When?
問題文はこちら
- Kの値を60で割った商と余りを使用する。
K = int(input())
mod = K % 60
q = K //60
H = 21 + q
if mod < 10:
M ="0%s"%mod
else:
M ="%s"%mod
print("%s:%s"%(H,M))
B - Number Box
問題文はこちら
- 出発点及び移動したマスを全探索。
- マス目の上下左右がつながっていることに関しては、Nの余りを取ることで考える。
#標準入力
N = int(input())
arr = [list(map(int,input())) for x in range(N)]
#探索時のベクトル
p = [1,1,1,0,0,-1,-1,-1] #左右の探索
q = [1,0,-1,1,-1,1,0,-1] #上下の探索
ans =0
for i in range(N):
for j in range(N):
for k in range(len(p)):
now = 0
#初期位置
x = i
y = j
for l in range(N):
now*=10
now+=arr[x][y]
x+=p[k]
y+=q[k]
x%=N #左右端移動時の対策
y%=N #上下端移動時の対策
ans = max(ans,now)
print(ans)
C - Rotation
問題はこちら
- 「S の末尾の文字を削除し、先頭に挿入する」という操作を実施した回数だけを考える。(愚直に計算した場合、実行制限時間に間に合わない。)
- 上記の操作をP回した後の文字列のi番目の文字は、操作する前の文字列の$(i-P)\mod N$番目の文字
例)
文字列:abcdefg (7文字)
3回操作した後の文字列の5番目の文字を考える。
下記の計算より、操作前文字列の2番目の文字であるとわかる。
$\begin{align}
\underset{文字列の順番(操作後)}{\underline{(5}}-
\underset{操作回数}{\underline{3}}\quad)
\mod
\underset{文字列の長さ}{\underline{7}}=
\underset{文字列の順番(操作前)}{\underline{2}}
\end{align}$
操作回数 | 文字列 |
---|---|
0 | abcdefg |
1 | gabcdef |
2 | fgabcde |
3 | efgabcd |
N,Q = map(int,input().split())
S = str(input())
arr = [list(map(int,input().split())) for x in range(Q)]
P =0
for i in range(len(arr)):
if arr[i][0] == 1:
P+= arr[i][1]
else:
num = (arr[i][1] - P) % N -1
print(S[num])