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]