ABC341をpythonで解く
問題文は問題 - トヨタ自動車プログラミングコンテスト2024#2(AtCoder Beginner Contest 341)を参照。
A
文字列を掛け算と足し算で作ります。これくらいだったら+と*を使って文字列を構成しても時間も間に合います。
N=int(input())
print("10"*N+"1")
B
国1の通貨を国2の通貨に、国2の通貨を国3の通貨に、……と番号の小さい国の通貨から順番に次の国の通貨に変えていくと、国Nの通貨の量を最大化できます。
N=int(input())
A=list(map(int,input().split()))
ST=[list(map(int,input().split())) for _ in range (N-1)]
for i in range (N-1):
S,T=ST[i]
bai=A[i]//S
A[i+1]+=bai*T
print(A[-1])
C
LRUDの移動で最初の地点から相対的な位置がどこに移動しているのか、その全地点をまず保持しておきます。その後、陸を全探索し、その陸の地点からスタートした時に、LRUDの移動した全地点がH*W内に入っていて、かつ陸となっていれば高橋君の初期位置の候補となります。
H,W,N=map(int,input().split())
T=input()
S=[input() for _ in range (H)]
LRUD={'L':(0,-1),'R':(0,1),'U':(-1,0),'D':(1,0)}
basyo=[(0,0)]
for i in T:
x=LRUD[i][0]+basyo[-1][0]
y=LRUD[i][1]+basyo[-1][1]
basyo.append((x,y))
syu=list(set(basyo))
ans=0
for i in range (H):
for j in range (W):
if S[i][j]=='#':
continue
hanntei=1
for k,l in syu:
if 0<=i+k<H and 0<=j+l<W:
if S[i+k][j+l]=='#':
hanntei=0
break
ans+=hanntei
print(ans)
D
gcd(N,M)=1とします。1じゃない場合はNとMをgcd(N,M)で割って答えを求めたのち、最後にその答えをgcd(N,M)倍すれば良いです。というわけで、以後、gcd(N,M)=1として進めていきます。
0からN*MまでにあるN or Mの倍数の個数はN-1+M-1個だと分かります。(K//(N-1+M-1))が1以上になっているのなら、ansをN*M*(K//(N-1+M-1))としてKをK%(N-1+M-1)で置き換えます。Kが0のとき、ansはans-min(N,M)になります。そうでないときは、ansはans+(K番目のN or Mの倍数)となります。この、K番目のN or Mの倍数は、以下の実装のようにやると比較的高速に求められます。
from math import gcd
N,M,K=map(int,input().split())
kake=gcd(N,M)
n=N//kake
m=M//kake
kosuu=n-1+m-1
syuuki=K//kosuu
amari=K%kosuu
ngawa=n
mgawa=m
ans=syuuki*(n*m)
if amari==0:
ans-=min(n,m)
print(ans*kake)
exit()
for i in range (amari):
if ngawa<mgawa:
at=ngawa
ngawa+=n
else:
at=mgawa
mgawa+=m
ans+=at
print(ans*kake)
E
見た感じ難しそうだった。
この記事が気に入ったらサポートをしてみませんか?