見出し画像

[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)


いいなと思ったら応援しよう!