結果
| 問題 |
No.145 yukiover
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-06-12 02:40:56 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 36 ms / 5,000 ms |
| コード長 | 3,028 bytes |
| コンパイル時間 | 305 ms |
| コンパイル使用メモリ | 13,056 KB |
| 実行使用メモリ | 11,392 KB |
| 最終ジャッジ日時 | 2024-07-06 15:48:17 |
| 合計ジャッジ時間 | 2,131 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 20 |
ソースコード
from collections import Counter
def read_data():
N = int(input())
S = input()
return N, S
def solve(N, S):
'''a b c d e f g h [i] j [k] l m n o p q r s t [u] v w x [y] z
yuki より辞書順で大きい文字列は、
z で始まるもの
y で始まり、2文字目がvwxyのいずれか(yをここで使うのが良いのかどうかは悩む。)
yu で始まり、3文字目がlmnopqrstuのいずれか
yuk で始まり、4文字目がjk のいずれか
yuki で始まり、5文字目がabcdefghi のいずれか
greedy に、上から順に作っていけばよいのか?
z と yv は確定させてもよさそう。
残りについては、yukiover, yukii, yukj, yukk, yul, yuu, yy の順に作っていく。
'''
c = Counter(S)
z = c['z']
y = c['y']
vwx = c['v'] + c['w'] + c['x']
u = c['u']
l2t = sum(c[ch] for ch in 'lmnopqrst')
k = c['k']
j = c['j']
i = c['i']
a2h = sum(c[ch] for ch in 'abcdefgh')
# z を切り出す
counts = z
# yv, yw, yx を切り出す
if y <= vwx:
return counts + y
y -= vwx
counts += vwx
return counts + solve_yukiover(y, u, l2t, k, j, i, a2h)
def solve_yukiover(y, u, l2t, k, j, i, a2h):
yukiover = min(y, u, k, i, a2h)
y -= yukiover
u -= yukiover
k -= yukiover
i -= yukiover
a2h -= yukiover
if y == 0:
return yukiover
if u == 0:
return yukiover + y // 2
if k == 0:
return yukiover + solve_yul(y, u, l2t)
if i == 0:
return yukiover + solve_yukj(y, u, l2t, k, j)
if a2h == 0:
return yukiover + solve_yukii(y, u, l2t, k, j, i)
def solve_yukii(y, u, l2t, k, j, i):
yukii = min(y, u, k, i//2)
y -= yukii
u -= yukii
k -= yukii
i -= yukii * 2
if y == 0:
return yukii
if u == 0:
return yukii + y // 2
if k == 0:
return yukii + solve_yul(y, u, l2t)
else:
return yukii + solve_yukj(y, u, l2t, k, j)
def solve_yukj(y, u, l2t, k, j):
yukj = min(y, u, k, j)
y -= yukj
u -= yukj
k -= yukj
j -= yukj
if y == 0:
return yukj
if u == 0:
return yukj + y // 2
if k == 0:
return yukj + solve_yul(y, u, l2t)
if j == 0:
return yukj + solve_yukk(y, u, l2t, k)
def solve_yukk(y, u, l2t, k):
yukk = min(y, u, k//2)
y -= yukk
u -= yukk
k -= yukk * 2
if y == 0:
return yukk
if u == 0:
return yukk + y // 2
else:
return yukk + solve_yul(y, u, l2t)
def solve_yul(y, u, l2t):
yul = min(y, u, l2t)
y -= yul
u -= yul
l2t -= yul
if y == 0:
return yul
if u == 0:
return yul + y // 2
if l2t == 0:
return yul + solve_yuu(y, u)
def solve_yuu(y, u):
yuu = min(y, u // 2)
y -= yuu
u -= yuu * 2
if y == 0:
return yuu
else:
return yuu + y // 2
if __name__ == '__main__':
N, S = read_data()
print(solve(N, S))