唯物是真 @Scaled_Wurm

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

AtCoder Beginner Contest #017 ooo-

51位, 301点
いつものABCよりも難しく感じた

A: プロコン - AtCoder Beginner Contest #017 | AtCoder

割合をかけて足すだけ
出力が整数なのに、急いでいて浮動小数点で計算して.0を出力してしまって1WA

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

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

a = ln()
b = ln()
c = ln()

print int(a[0] * a[1] / 10.0 + b[0] * b[1] / 10.0 + c[0] * c[1] / 10.0)

B: choku語 - AtCoder Beginner Contest #017 | AtCoder

与えられた文字列が、ch, o, k, uのいずれかの0回以上の繰り返しかどうかを判定する
解説生放送のコメントで流れてた正規表現を使うのは頭よい方法だと思った

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

def s():
    return raw_input().strip()

a = s()

pos = 0
key = set('oku')
while pos < len(a):
    temp = a[pos:pos+2]
    if temp.startswith('ch'):
        pos += 2
    elif temp[0] in key:
        pos += 1
    else:
        print 'NO'
        break
else:
    print 'YES'

C: ハイスコア - AtCoder Beginner Contest #017 | AtCoder

連続した範囲と点数のペアが複数与えられる
全体を覆わないようにペアを選んだ時の最大値を答える

1箇所覆わない場所を選んで、その左右の累積和が最大のところを選ぶ

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

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

N, M = ln()
t = []
for i in xrange(N):
    lt, rt, st = ln()
    t.append((lt, rt, st))

score1 = [0] * (M + 1)
for l, r, s in t:
    score1[r] += s
temp = 0
for i in xrange(M + 1):
    score1[i] += temp
    temp = score1[i]

score2 = [0] * (M + 1)
for l, r, s in t:
    score2[l] += s
temp = 0
for i in xrange(M, -1, -1):
    score2[i] += temp
    temp = score2[i]

result = -1
for i in xrange(1, M + 1):
    score = 0
    if i - 1 > 0:
        score += score1[i - 1]
    if i + 1 < M + 1:
        score += score2[i + 1]
    if score > result:
        result = score

print result

D: サプリメント - AtCoder Beginner Contest #017 | AtCoder

\(N\)個のサプリメントが順番と種類付きで与えられる
サプリメントを順番通りに食べて行く時、1日に同じ種類のサプリメントを最大1つずつ食べれるとすると、何通りの食べ方があるか答える

公式の解説がわかりやすかった
\(i\)種類までのサプリメントを食べるときの食べ方は、その\(i\)より前の同じ種類のサプリメントを2つ以上含まない範囲での食べ方の数の和から計算できる
範囲はどんどん進んでいくので、和はしゃくとり法で効率的に計算できる

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

def n():
    return int(raw_input())
def ln():
    return map(int, raw_input().strip().split())

N, M = ln()
F = []
for i in xrange(N):
    F.append(n())

score = [0] * (N + 1)
score[0] = 1

cur = 0
sum = 1
count = [0] * (M + 1)
MOD = 1000000007
for i in xrange(N):
    count[F[i]] += 1
    while count[F[i]] > 1:
        count[F[cur]] -= 1
        sum += MOD - score[cur]
        sum %= MOD
        cur += 1
    score[i + 1] = sum
    sum += score[i + 1]
    sum %= MOD

print score[-1]