[ABC256]東京海上日動プログラミングコンテスト2022(AtCoder Beginner Contest 256)A~C問題Python解説
A問題
pythonの場合x^yはx**yと表します。
n=int(input())
print(2**n)
B問題
この問題にはいろいろやり方ありますので、一例としてみてください。
(野球のルールを知らない人は、このやり方ではわからないかもしれません。)
問題文を読解すると、バッターがn人いて、
数列Aにはバッターiが打ったヒットの種類が入っていると思ってください。
1<=Ai<=4なので、1は1H、2は2H、3は3H、4はHRです。
次に、新たにバッターの現在地を表すリストmを作ります。
バッターiがいる場所がm[i]です。
0をベンチ、1をバッターボックス、2~4を1塁、2塁、3塁とします。
まず、最初は全員ベンチにいます。
ここからは繰り返しになりますが、まずバッターiをバッターボックスに立たせ、
Aiで何らかのヒットを打ちます。
もし、ランナーがいる場合は(m[i]!=0)それぞれランナーも進めます。
ホームに帰ってきたら、点数を追加(P+=1)して、ランナーをベンチに返します。
n=int(input())
a=list(map(int,input().split()))
p=0
m=[0]*n
for i in range(n):
m[i]=1
for j in range(n):
if m[j]!=0:
if m[j]+a[i]>=5:
m[j]=0
p+=1
else:
m[j]+=a[i]
print(p)
C問題
9マス全てを全探索するとTLEになるので、左上の4マスだけ考えます。
何故4マスだけでいいかというと、各行or列の合計値は入力値で決まっているので、
各行or列それぞれ2つ決めてしまえば、合計値から引くことで、最後の1マスも自動的に決まるのです。
では、具体的に観ていきましょう。
M11 M21 M31
M12 M22 M32
M13 M23 M33
マス目を上記のように名付けしておきましょうか。
まず、4マス埋めて2×2のマス目の候補全てを考えます。
この時マスは3≤h1,h2,h3,w1,w2,w3≤30という制約から、
1~28に制約されますね。
次に決まったM11,M21,M12,M22とh1,h2,h3,w1,w2,w3を使って、
M31,M32,M13,M23,M33を導き出します。
これによって、9マスのマス目に整数を入れることができました。
最後にこの9マスは条件を満たすのか確認していきます。
まずは、作ったM31,M32,M13,M23,M33が0より大きい整数なのか、
そして、作った条件とは逆の条件(私はh3を満たす条件でM33を作ったので逆のh3を満たすという条件)を満たすのかを調べ、
両者を満たす場合は条件を満たす9マスとなります。
h1,h2,h3,w1,w2,w3=map(int,input().split())
c=0
for M11 in range(1,29):
for M21 in range(1,29):
for M12 in range(1,29):
for M22 in range(1,29):
M31=h1-M11-M21
M32=h2-M12-M22
M13=w1-M11-M12
M23=w2-M21-M22
M33=w3-M31-M32
if M31>0 and M32>0 and M13>0 and M23>0 and M33>0 and M13+M23+M33==h3:
c+=1
print(c)