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

 見た感じ難しそうだった。

以下リンク
ABC340/ホーム/ABC342

この記事が気に入ったらサポートをしてみませんか?