stkblog

白血病と関係ないことを書きます なにかあったら教えて下さい

Codeforces#334 Div.2 AとB やった

A Uncowed Forces

Problem - A - Codeforces

やるだけ系問題。
問題文に書いてある数式を python でかく
250でわるところだけ一応気をつける

M = map(int, raw_input().split())
W = map(int, raw_input().split())
hs, hu = map(int, raw_input().split())


X = [500, 1000, 1500, 2000, 2500]

score = 0
for i in xrange(5):
    score += max(0.3*X[i], ( (1-(M[i]/250.0)) * X[i] - 50 * W[i] ) )

score += hs*100
score -= hu*50

print int(score)

B More Cowbell

Problem - B - Codeforces

n個の大きさの異なるカウベルを k個の同じ大きさの箱に収納する。箱の大きさがカウベルの大きさ(の和)より大きい場合でも、箱に入るカウベルは最大2個。
箱の大きさの最小値を求める。

  1. k個の箱を用意します
  2. 大きい方からとりあえず1個ずつ配っていきます
  3. 余ったのは逆順に入れていきます(全体のmaxが大きくならないように)
  4. 2つ入れた箱は和を出してから、全部の max を取ります
n, k = map(int, raw_input().split()) # 4 3
S = map(int, raw_input().split())   # 2 3 5 9

cases = [[] for _ in xrange(k)] # [ [], [], [] ]

for i in xrange(k):
    cases[i].append(S.pop())  #[ [9], [5], [3] ]

cases.reverse()  # [ [3], [5], [9] ]

for i in xrange(len(S)):
    cases[i].append(S.pop())   # [ [3, 2], [5], [9] ]

cases = map(lambda x: sum(x), cases) # [ [5], [5], [9] ]

print max(cases) # 9

n < k の場合を考えてなかったので、ランタイムエラーで無事死亡(朝起きてから気付く)

if n <= k:
    print max(S)
else:

を足せばACだった。無念

寝てるあいだに気付いた

大きさ 0 のカウベルを (2k-n) 個持ってきて、2k個のカウベルを2こずつ入れると考えると、大きいのと小さいのをペアにしていけばいいのでシンプルだった。

n, k = map(int, raw_input().split()) #4 3
S = map(int, raw_input().split()) # 2 3 5 9

S = [0] * max(0, 2*k-n) + S # 0 0 2 3 5 9

max_weight = -1
for i in xrange(len(S)/2):
    weight = S[i] + S[-i-1] # 0+9, 0+5, 2+3
    max_weight = max(max_weight, weight) 

print max_weight

C

よくわからなかったので Editorial 見て考えます

Topcoder SRM 674 Div.2 Easy だけやった

初 TopcoderSRM.

250 Relation Classifier

2つの要素の数が等しいリスト X, Y が与えられるので 全単射 (? bijection) になっているかどうか判定しなさい

要素の数が等しいので、要するに1対1対応になってるかどうか?
X, Y がそれぞれ重複のないリストなら1対1対応しているはず

ということをサンプルを見て推測(勘)

全単射 - Wikipedia

class RelationClassifier:
    def isBijection(self, domain, range):
        if len(set(domain)) != len(domain) or\
           len(set(range)) != len(range):
           return 'Not'
        else:
           return 'Bijection'


通ったっぽいのでおk

500 Plane Game

手元の紙に座標かいて遊んでたけどよくわかりませんでした(雑魚なため

Codeforces#333 Div.2 AとB やった

まとめ

A はちょっと時間かかった。
B は死ぬほど時間かかった上に起きたら落ちてた。
Rating も下がった。
C ~ は実力とやる気が足りない

A. Two Bases

codeforces.com

入力の数が多くて怯んだ(雑魚

{ \displaystyle
101111_{(2)} = 1\cdot2^5 + 0\cdot2^4 + 1\cdot2^3 + 1\cdot2^2 + 1\cdot2^1 + 1\cdot2^0
= 47_{(10)}
}

みたいな感じで10進法に(じゃなくてもいいけど)揃えて比べればおk

提出(AC)

n, m = map(int, raw_input().split())
X = map(int, raw_input().split())

ans_x = 0
for i in xrange(n):
    ans_x += X[i] * m**(n-i-1)

n, m = map(int, raw_input().split())
X = map(int, raw_input().split())

ans_y = 0
for i in xrange(n):
    ans_y += X[i] * m**(n-i-1)

if ans_x > ans_y:
    print '>'
elif ans_x < ans_y:
    print '<'
else:
    print '='

最初Xをまずつなげてから整数になおして…とか考えてしまったので、10分もかかってしまった。

清書

def calc():
    n, m = map(int, raw_input().split())
    X = map(int, raw_input().split())
    ans = 0
    for i in xrange(n):
        ans += X[i] * m**(n-i-1)
    return ans

x = calc()
y = calc()

if x > y:
    print '>'
elif x < y:
    print '<'
else:
    print '='

2回繰り返してる部分ダサいかなと思ったので

B. Approximating a Constant Range

codeforces.com

与えられた数列の中で 最大と最小が1以内 になるような数列の長さ。

提出(TLE)

隣り合った数字2つとって順番にチェックすればわかるのではないだろうか → TLE
n * (M-m) 回(?)

n = input()
A = map(int, raw_input().split())

m, M = min(A), max(A)

longest = 1
cnt = 0
for i in xrange(M-m):
    l, r = m+i, m+i+1
    for a in A:
        if a in [l,r]:
            cnt += 1
        else:
            longest = max(longest, cnt)
            cnt = 0
    else:
        longest = max(longest, cnt)
        cnt = 0

print longest

提出(RE)

はじめて値が変わったポイント覚えておいて次回はそこからスタートすればよいのではないだろうか
プレテストこれで通ったので寝た。REて。

n = input()
A = map(int, raw_input().split())

l, r, cnt, ans = 0, 1, 0, 0
first = True
while r <= n:
    if first and A[l] != A[r]:
        first = False
        next = r
    else:
        if max(A[l:r]) - min(A[l:r]) < 2:
            r += 1
            cnt += 1
        else:
            ans = max(ans, cnt)
            l,r = next,next+1
            cnt = 0
            first = True
else:
    ans = max(ans, cnt)

print ans
3
1 1 1

r=3 になる → A[3] を見ようとする → IndexError


他の人のAC提出をカンニングしたりして(あんまりよくわからなかったけど)ごちゃごちゃやってたらうまくいった

AC

n = input()
A = map(int, raw_input().split())

l, c, cnt, ans = 0, 1, 0, 2
first = True
mx, mn = A[0], A[0]

while l+c <= n:
    if A[l] == A[min(n-1, l+c)]:      #右端の値が同じなら
        c += 1                      #もう1つ右をみる
    else:                                #ちがったら
        if first:                      #それがはじめてなら
            first = False
            next_l = l+c                     #つぎそこから始めるので覚えとく

        if A[l] < A[min(n-1, l+c)]:        #右に大きい値が出てきたなら
            mx = A[min(n-1, l+c)]       #それが今見てる数列の上の値
        elif A[l] > A[min(n-1, l+c)]:      #その逆
            mn = A[min(n-1, l+c)]

        if mx - mn >= 2:             #上の値と下の値が2離れたらおわり
            ans = max(ans, c)  
            c = 1
            l = next_l
            first = True
            mx = mn = A[l]
        else:                          #まだいけるなら
            c += 1                   #もう1つ右を見る
else:                                  #最後の1回
    ans = max(ans, c-1)     

print ans

あんまり解けたって感じしてない。
まあぼちぼちやっていきます

Div.2 で2完が当面の目標(低

KawigiEdit で Topcoder できるようになった(たぶん

mog project: TopCoder: Setting up KawigiEdit

「Python でも Topcoder できるけどプラグインがどーの」って見たので面倒くさそうだな、と思ってたけど別にめんどくさくなかった。

Topcoder のアカウントつくって、
Java インストールして、
Topcoder のアプレットダウンロードして、
あとは mog project: TopCoder: Setting up KawigiEdit の言うとおりにする。

問題を開くと指定したフォルダに (問題名).py ができるのでそれを編集すればいいっぽい。
練習ではうまくできたのでとりあえずこれでよさそう。

Codefestival 決勝 A-E 勝手にやった

code-festival-2015-final-open.contest.atcoder.jp

A コード川柳

A: コード川柳 - CODE FESTIVAL 2015 決勝(オープンコンテスト) | AtCoder
文字列の長さが575かどうか調べる。

inputs = raw_input().split()
lengths = map(len, inputs)
if lengths == [5,7,5]:
    print 'valid'
else:
    print 'invalid'

B ダイスゲーム

B: ダイスゲーム - CODE FESTIVAL 2015 決勝(オープンコンテスト) | AtCoder

N個のダイスを投げた目の和として最も確率の高い、最小の数

N = input()

if N == 1:
    print 1
else:
    print int(3.5*N)

「和の期待値は期待値の和」とかあったと思う

C 寿司タワー

C: 寿司タワー - CODE FESTIVAL 2015 決勝(オープンコンテスト) | AtCoder

できるだけ寿司を分解せずに、求める寿司タワーを作る(リンク先参照

N = input()
tower = list(raw_input())

for i in xrange(2*N-1):
    if tower[i] != '2' and tower[i] != tower[i+1]:
        tower[i] = tower[i+1] = '2'
    #そのままつかえるものはそのまま使う(→2に変えてみた)

answer = N - tower.count('2') / 2 #そのままつかえないもの÷2
print answer

GOAL GATE 高原直泰 1979‐2003

GOAL GATE 高原直泰 1979‐2003

D 足ゲームII

D: 足ゲームII - CODE FESTIVAL 2015 決勝(オープンコンテスト) | AtCoder
(N−1)個の区間を埋めるための最小値(リンク先参照

いきなり難しくない?解説も見たけどピンとこず
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 決勝 : D - 足ゲームII - kmjp's blog


こういうことかなと思ったけど

# TLE
N = input()
buttons = [map(int, raw_input().split()) for loop in xrange(N)]

times = list(set([item for sublist in buttons for item in sublist]))
times.sort() #境目となる時間リスト

needs = []
for time in times:
    cnt = 0
    for button in buttons:
        if button[0] <= time < button[1]:
            cnt += 1
    needs.append(cnt)
#必要な人数リスト

peaks = [i for i in xrange(N) if needs[i] == max(needs)] #そのピーク
sta, end = peaks[0], peaks[-1]+1
sta, end = times[sta], times[end]

for button in buttons:
    if button[0] <= sta and end <= button[1]:
        covered = True
        break
else:
    covered = False
# それをカバーする区間があれば True

print max(needs) - (covered)

E ショートコーディング

E: ショートコーディング - CODE FESTIVAL 2015 決勝(オープンコンテスト) | AtCoder
! と - からなる言語のコードと等価な、最短のコード

入力が 0 と それ以外 で結果変わるんだろうだなと思いながら実験 (test)、有限っぽいので短い順に(長さ3まで)試して書いた

S = list(raw_input())
S = S[::-1]

def test(S):
    a, b = 0, 256
    for s in S:
        if s == '-':
            a = -a
            b = -b
        elif s == '!':
            a = 0 if a != 0 else 1
            b = 0 if b != 0 else 1
    return a, b

def solve(S):
    if test(S) == (0, 256):
        return ''
    elif test(S) == (0, -256):
        return '-'
    elif test(S) == (1, 0):
        return '!'
    elif test(S) == (0, 1):
        return '!!'
    elif test(S) == (-1, 0):
        return '-!'
    elif test(S) == (0, -1):
        return '-!!'

print solve(S)

まあACになってよかった

言語処理100本ノックやった 16

過去

steek.hatenablog.com

など

#16 ファイルをN分割する

# -*- coding: utf-8 -*-
#行数カウント (cf. #10)
fhand = open('hightemp.txt')
n_line = 0
for line in fhand:
    n_line += 1
fhand.close()
print n_line #24

N = input() #5
line_per_file = n_line/N
remainder = n_line%N
lines_per_file = [line_per_file + 1] * remainder\
                + [line_per_file] * (N-remainder)

print lines_per_file # [5, 5, 5, 5, 4]
#Nで割り切れないときはあまりを前から足してく

with open('hightemp.txt') as fhand:
    for i in xrange(N):
        filename = 'divided_0%d.txt' %i #divided_01.txt etc.
        with open(filename, 'w') as file_to_write:
            for loop in xrange(lines_per_file[i]): # loop回 行を読む→書きこむ
                line = fhand.readline()
                file_to_write.write(line.strip() + '\n')

実行するとこんな感じに
f:id:steek79:20151113133537p:plain

lines_per_file 作るところで時間かかった。この書き方でいいのかな


以上