結果
| 問題 |
No.2553 Holidays
|
| コンテスト | |
| ユーザー |
Seed57_cash
|
| 提出日時 | 2023-11-21 19:04:12 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,176 bytes |
| コンパイル時間 | 429 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 78,080 KB |
| 最終ジャッジ日時 | 2024-09-26 10:20:29 |
| 合計ジャッジ時間 | 5,730 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 WA * 30 |
ソースコード
def solve(n, m, s):
# o---x or x---o
# o---o
# x---x
# がそれぞれ長さいくつが何個あるか数える
type_0 = [0] * (n + 1)
type_1 = [0] * (n + 1)
type_2 = [0] * (n + 1)
left = "x"
c = 0
res = 0
xc = 0
for i in range(n + 1):
if i < n:
a = s[i]
if a == "x":
xc += 1
else:
a = "x"
if a == "o":
res += 1
if a == "-":
c += 1
else:
if a == "x" and left == "x":
type_2[c] += 1
elif a == "o" and left == "o":
type_1[c] += 1
else:
type_0[c] += 1
c = 0
left = a
# そもそも休み
res += type_1[1]
# print(res)
# print(type_0)
# print(type_1)
# print(type_2)
# 貪欲
mm = m
for i in range(3, n + 1, 2):
d = min(mm // (i // 2), type_1[i])
res += i * d
mm -= d * (i // 2)
if d < type_1[i]:
res += 2 * mm
mm = 0
break
# 2倍増えるところ
twos = 0
for i in range(2, n + 1, 2):
twos += type_1[i] * (i // 2)
for i in range(n + 1):
twos += type_0[i] * (i // 2)
# print(twos)
if mm > twos:
res += 2 * twos
mm -= twos
else:
res += 2 * mm
mm = 0
# 2倍弱増えるところ
for i in range(n, 0, -1):
d = min(mm // ((i + 1) // 2), type_2[i])
res += i * d
mm -= d * ((i + 1) // 2)
if d < type_2[i]:
res += 2 * mm - 1
mm = 0
break
# それでも余った場合
res_max = n - xc
res = min(res + mm, res_max)
# print(res)
return res
def main():
n, m = map(int, input().split())
s = input()
res = solve(n, m, s)
print(res)
def test():
assert solve(8, 2, "x-o----x") == 5
assert solve(20, 5, "xo--x-o--o--------ox") == 14
assert solve(5, 0, "xo-ox") == 3
assert solve(20, 20, "xo--x-o--o--------ox") == 17
assert solve(5, 5, "xo-ox") == 3
if __name__ == "__main__":
test()
main()
Seed57_cash