Codeforces#334 Div.2 AとB やった
A Uncowed Forces
やるだけ系問題。
問題文に書いてある数式を 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
n個の大きさの異なるカウベルを k個の同じ大きさの箱に収納する。箱の大きさがカウベルの大きさ(の和)より大きい場合でも、箱に入るカウベルは最大2個。
箱の大きさの最小値を求める。
- k個の箱を用意します
- 大きい方からとりあえず1個ずつ配っていきます
- 余ったのは逆順に入れていきます(全体のmaxが大きくならないように)
- 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 見て考えます
Rating
1408 (-6)
やめて弱者をいじめないで
Topcoder SRM 674 Div.2 Easy だけやった
初 TopcoderSRM.
250 Relation Classifier
2つの要素の数が等しいリスト X, Y が与えられるので 全単射 (? bijection) になっているかどうか判定しなさい
要素の数が等しいので、要するに1対1対応になってるかどうか?
X, Y がそれぞれ重複のないリストなら1対1対応しているはず
ということをサンプルを見て推測(勘)
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
入力の数が多くて怯んだ(雑魚
みたいな感じで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
与えられた数列の中で 最大と最小が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
- 作者: 佐藤俊
- 出版社/メーカー: 小学館
- 発売日: 2003/04
- メディア: 単行本
- クリック: 2回
- この商品を含むブログ (9件) を見る
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
#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')
実行するとこんな感じに
lines_per_file 作るところで時間かかった。この書き方でいいのかな
以上