読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

ARC052 に参加しました

更新が遅れている。(ネタを貯めこんで書かないダメな人)


ARC久々に出ました。A, Bの2完とD部分点の210点でした。74位。点数はさておき、久々に2桁入れた気がするので良かったですね。



A問題

A: 何期生? - AtCoder Regular Contest 052 | AtCoder

文字列の中に数字が紛れているので、その数字を出力するだけの問題でした。


本番は文字を1つずつ見ていってリストに突っ込むという方法を取りましたが、解き直した所これ正規表現でalphabetを全てから文字に変換すればいいことに気がつく。頭が弱い。

本番のコード

Submission #712393 - AtCoder Regular Contest 052 | AtCoder

def solve():
    n = input()
    al = []
    for c in n:
        if c.isdigit():
            al.append(c)
    print(int("".join([str(i) for i in al])))
 
if __name__=="__main__":
    solve()
解き直したコード

Python
Submission #713642 - AtCoder Regular Contest 052 | AtCoder

import re
print(re.sub(r'[a-zA-Z]', '', input()))

Ruby
Submission #713645 - AtCoder Regular Contest 052 | AtCoder

puts gets.gsub(/[a-zA-Z]/,"")

B問題

B: 円錐 - AtCoder Regular Contest 052 | AtCoder

区間内に含まれる円錐の体積は? みたいな問題なのですが…。
結構様々な攻め方ができるみたいです。私は思いつきませんでしたが、累積和を使ったりすることもできるんだとか。


私はあまりよろしくない方法なのですが、場合分けに走りました。大小関係のパターンがせいぜい5通りくらいだなあと思ったので、それを実行する…。

円錐の体積や体積比をどう求めて良いのかわからず、プログラムを書く時間より調べ物をする時間のほうが圧倒的に長かったような気がします。こういう基本的なことについては、そもそもちゃんと覚えておきたいですね…(体積はまだいいものの、体積の比率をどう出すべきなのかで非情に悩んでいた)


以下にぐたぐたなコードを載せておきます。

本番のコード
import math
 
def solve():
    n, q = map(int, input().split())
    al = [[0, 0, 0, 0, 0] for _ in range(n)]
    calcV = lambda r, h: ((math.pi) * (r ** 2) * h) / 3
    for i in range(n):
        x, r, h = map(int, input().split())
        al[i] = [x, r, h, calcV(r, h), x + h]
 
    for i in range(q):
        a, b = map(int, input().split())
        res = 0.0
        for e in al:
            # 処理しない
            if b <= e[0] or e[4] <= a:
                continue
 
            if a <= e[0] < e[4] <= b:
                res += e[3]
            elif a <= e[0] <= b <= e[4]:
                t = e[4] - b
                res += e[3] - (e[3] * (t ** 3) / (e[2] ** 3))
            elif e[0] <= a <= e[4] <= b:
                t = e[4] - a
                res += e[3] * (t ** 3) / (e[2] ** 3)
            elif e[0] <= a < b <= e[4]:
                tres = 0.0
                t = e[4] - a
                tres += e[3] * (t ** 3) / (e[2] ** 3)
                t1 = e[4] - b
                tres -= e[3] * (t1 ** 3) / (e[2] ** 3)
                res += tres
        print(res)
 
if __name__=="__main__":
    solve()


ところで、フォロワーさんから意見いただいたのですが。


かしこい… 確かにコードを読んでみたのですが、合ってる…。ふええ。


場合分けをできるだけ減らさないとダメだなあと思ったB問題でした(反省)

D問題部分点

載せなくてもいいレベルなので載せませんが、総当りです。
ただ私は順位表をみて10点とってる人めっちゃ多いと思ってC問題を読まずにD問題の部分点を取りに行きました。結果的にこれは成功だったかなあと。



以上です。とりあえずB問題は通せましたが、コードが冗長になりお世辞にも良いとはいえませんでした。
競技プログラミングはACを取りに行かなければいけないのですが、問題を解く速度もある程度考えたいですねえ。