水面下の夢

競プロやイラストに興味があります.メインブログがここ.同人サークル「かのらぶ」のページはこっち( https://yumechi0525.amebaownd.com ).ブログアイコンはYaQ(@8_9_00)さんから.

ABC045に参加しました

3完。68th。もう少し上行けたはず。



A問題

A: 台形 / Trapezoids - AtCoder Beginner Contest 045 | AtCoder


台形の公式にぶち込む。python2でかいた。

print (input()+input())*input()/2

Submission #875917 - AtCoder Beginner Contest 045 | AtCoder

B問題

B: 3人でカードゲームイージー / Card Game for Three (ABC Edit) - AtCoder Beginner Contest 045 | AtCoder


言われたとおりにシミュレーションする。Python3でかいた。多分繰り返し処理はもう少し綺麗にかけるけど、とりあえずACするために雑にかいた。

a = list(input())
b = list(input())
c = list(input())
current = "a"
while True:
    if current == "a":
        if len(a) == 0:
            print("A")
            break
        else:
            current = a.pop(0)
    elif current == "b":
        if len(b) == 0:
            print("B")
            break
        else:
            current = b.pop(0)
    else:
        if len(c) == 0:
            print("C")
            break
        else:
            current = c.pop(0)

Submission #876284 - AtCoder Beginner Contest 045 | AtCoder

C問題

C: たくさんの数式 / Many Formulas - AtCoder Beginner Contest 045 | AtCoder

プラスを入れていく位置の候補は2 ** (文字列の長さ - 1) 通りあるので、bitを使ってプラスが入った文字列を形成してevalで計算。こういう場合はevalして大丈夫ですから>< Python3でかいた。

def solve():
    n = input()
    ans = 0
    for i in range(2 ** (len(n) - 1)):
        insertcount = 0
        count = 0
        line = list(n)
        j = i
        while j > 0:
            if j & 1 == 1:
                line.insert(1 + count + insertcount, "+")
                insertcount += 1
            count += 1
            j >>= 1
        ans += eval("".join(line))
    print(ans)
 
if __name__=="__main__":
    solve()

Submission #876910 - AtCoder Beginner Contest 045 | AtCoder

D問題

D: すぬけ君の塗り絵 / Snuke's Coloring - AtCoder Beginner Contest 045 | AtCoder

時間内に解けなかったので悔しい。いろいろ解放があるとは思うが、黒塗りになっている場所とその周りに1をたしていき、dictionaryで持っておいて置いて、最後に数え上げる、という方針でAC。3secでよかった。2secなら落ちていた。


注意すべきは端の部分では3x3の三角形が作れないこと。そのため、端の部分にはあらかじめ足さないように処理するとよい。あと0個のものは(正方形が作れる個数 - 1〜9個の黒塗りになっている部分を含んだ正方形の合計個数)で求められるので、わざわざか添え上げる必要が無い。

雰囲気的にO(N)でしか間に合いそうになかったので、うまく思いつくことが出来てよかったが、時間内に通せなかったのが心残り。Python3で解いた。

def solve():
    w, h, n = [int(i) for i in input().split()]
    dic = dict()
    for i in range(n):
        a, b = map(lambda x: int(x) - 1, input().split())
        for j in range(3):
            for k in range(3):
                aj = a + j - 1
                bk = b + k - 1
                if 0 < aj and aj < w - 1 and 0 < bk and bk < h - 1:
                    if (aj, bk) in dic:
                        dic[(aj, bk)] += 1
                    else:
                        dic[(aj, bk)] = 1
    ans = [0 for i in range(10)]
    for v in dic.values():
        ans[v] += 1
    for i in range(10):
        if i == 0:
            print((w - 2) * (h - 2) - sum(ans))
        else:
            print(ans[i])
 
 
if __name__=="__main__":
    solve()

Submission #878283 - AtCoder Beginner Contest 045 | AtCoder




D問題を時間に通せたら非常に良かったんですが。。。反省だなあ。


それとこの前問題を読んだだけのCFを埋めておきたい。(unratedになったやつ)