更新が遅れている。(ネタを貯めこんで書かないダメな人)
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()
ところで、フォロワーさんから意見いただいたのですが。
@yumechi0525 累積和とらなくてもminmaxで差を0にしてやるのが楽だと思います. https://t.co/cEuApXz2Vw
— バタ子 (@btk15049) 2016年4月30日
かしこい… 確かにコードを読んでみたのですが、合ってる…。ふええ。
場合分けをできるだけ減らさないとダメだなあと思ったB問題でした(反省)
D問題部分点
載せなくてもいいレベルなので載せませんが、総当りです。
ただ私は順位表をみて10点とってる人めっちゃ多いと思ってC問題を読まずにD問題の部分点を取りに行きました。結果的にこれは成功だったかなあと。
以上です。とりあえずB問題は通せましたが、コードが冗長になりお世辞にも良いとはいえませんでした。
競技プログラミングはACを取りに行かなければいけないのですが、問題を解く速度もある程度考えたいですねえ。