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

唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

AtCoder Beginner Contest #011 oooo

競技プログラミング atcoder

全問解けて33/361位でした

A: 来月は何月? - AtCoder Beginner Contest #011 | AtCoder

与えられた月の次の月を出力するだけ

最速解答を目指して読み込み用の関数とか作っておいたりあらかじめhttp://abc011.contest.atcoder.jp/tasks/abc011_1を開くようにしたりsubmitの時にPythonが自動で選択されるようにしたのですが、最速には届かず(5番目)

# -*- coding: utf-8 -*-
import math,string,itertools,fractions,heapq,collections,re,array,bisect

def s():
    return raw_input().strip()
def n():
    return int(raw_input())
def d():
    return float(raw_input())

def ls():
    return raw_input().strip().split()
def ln():
    return map(int, raw_input().strip().split())
def ld():
    return map(float, raw_input().strip().split())

def fs():
    return [raw_input().strip() for i in xrange(input())]
def fn():
    return [int(raw_input().strip()) for i in xrange(input())]
def fd():
    return [float(raw_input().strip()) for i in xrange(input())]


a = n()

print a % 12 + 1

B: 名前の確認 - AtCoder Beginner Contest #011 | AtCoder

文字列の1文字目を大文字、2文字目以降を小文字に直して出力

# -*- coding: utf-8 -*-
import math
import sys
import datetime

s = raw_input().strip()

print s[0].upper() + s[1:].lower()

C: 123引き算 - AtCoder Beginner Contest #011 | AtCoder

ある数字から1から3の数字を引く操作を100回までできるときに、3つのNG数字と等しくならずに0にできるかを答える
貪欲に引ける時はできるだけ大きい数を引いていけば良い

# -*- coding: utf-8 -*-
import math
import sys
import datetime
from decimal import *

n = input()
a = input()
b = input()
c = input()

ng = set([a, b, c])

if n in ng:
    print 'NO'
    sys.exit()

count = 0
while n > 0:
    if n - 3 not in ng:
        n -= 3
        count += 1
    elif n - 2 not in ng:
        n -= 2
        count += 1
    elif n - 1 not in ng:
        n -= 1
        count += 1
    else:
        print 'NO'
        break
else:
    if count <= 100:
        print 'YES'
    else:
        print 'NO'

D: 大ジャンプ - AtCoder Beginner Contest #011 | AtCoder

上下左右に\(\frac{1}{4}\)の確率で\(D\)移動するのを\(N\)ターン繰り返した時に、最終的に\(X, Y\)の場所に到達している確率を答える
上下に何回動くかを決めれば可能な左右の回数も決まるので、組み合わせを使って確率を計算して足していく

オーバーフローしているぽかったので(?)途中はlogを使って計算している

# -*- coding: utf-8 -*-
import math
import sys
import datetime
from decimal import *

def make_comb_dp(n):
    dp = [[0] * (n + 1) for i in xrange(n + 1)]
    for i in xrange(n + 1):
        dp[i][0] = 1
        dp[i][i] = 1
    for i in xrange(2, n + 1):
        for j in xrange(1, i):
            dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
    return dp


N, D = map(int, raw_input().split())
X, Y = map(int, raw_input().split())
X = abs(X)
Y = abs(Y)

if X % D != 0 or Y % D != 0 or (N - (X / D) - (Y / D)) % 2 == 1 or (N - (X / D) - (Y / D)) < 0:
    print 0.0
    sys.exit()


comb = make_comb_dp(1000)

minX = X / D
minY = Y / D


prob = 0.0
pp = 1.0 / 4
for x in xrange(0, N - minX - minY + 1, 2):
    y = N - minX - x - minY
    t = math.log(comb[minX + x][x / 2]) + (minX + x)*math.log(pp) + math.log(comb[minX+x+y/2][y/2]) + math.log(comb[N][minY+y/2]) + (minY + y) * math.log(pp)
    prob += math.exp(t)

print prob
-->