Problem p02598 (python)

Fixed submission:
import sys
from io import StringIO
import unittest
import os
import math

# 再帰処理上限(dfs作成時に設定するのが面倒なので限度近い値を組み込む)
sys.setrecursionlimit(999999999)


# 実装を行う関数
def resolve(test_def_name=""):
    n, k = map(int, input().split())
    a_s = list(map(int, input().split()))

    right = 1000000001
    left = 0

    # ループ数に意味はない
    for i in range(100):

        middle = (left + right) // 2

        if middle == 0:
            break

        # middleより長い木を切る(切るべき回数の合計を取得する)
        cnt = 0
        for a in a_s:
            if a > middle:
                # 4/2 = 2    なら1回切る必要がある
                # 4/3 = 1.33 なら1回切る必要がある
                # 7/3 = 2.33 なら2回切る必要がある
                cnt += math.ceil(a / middle) - 1

        if cnt < k:
            # 最大値を下げる=小さい方に寄せる
            right = middle
        elif cnt > k:
            # 最小値を上げる=大きい方に寄せる
            left = middle
        else:
            # 最大値を下げる=小さい方に寄せる
            right = middle

    print(middle + 1)


# テストクラス
class TestClass(unittest.TestCase):
    def assertIO(self, assert_input, output):
        stdout, sat_in = sys.stdout, sys.stdin
        sys.stdout, sys.stdin = StringIO(), StringIO(assert_input)
        resolve(sys._getframe().f_back.f_code.co_name)
        sys.stdout.seek(0)
        out = sys.stdout.read()[:-1]
        sys.stdout, sys.stdin = stdout, sat_in
        self.assertEqual(out, output)

    def test_input_1(self):
        test_input = """2 3
7 9"""
        output = """4"""
        self.assertIO(test_input, output)

    def test_input_2(self):
        test_input = """3 0
3 4 5"""
        output = """5"""
        self.assertIO(test_input, output)

    def test_input_3(self):
        test_input = """10 10
158260522 877914575 602436426 24979445 861648772 623690081 433933447 476190629 262703497 211047202"""
        output = """292638192"""
        self.assertIO(test_input, output)

    # 自作テストパターンのひな形(利用時は「tes_t」のアンダーバーを削除すること
    def test_1original_1(self):
        test_input = """2 4
2 3"""
        output = """1"""
        self.assertIO(test_input, output)


# 実装orテストの呼び出し
if __name__ == "__main__":
    if os.environ.get("USERNAME") is None:
        # AtCoder提出時の場合
        resolve()

    else:
        # 自PCの場合
        unittest.main()

Buggy submission (verdict: Runtime Error):
import sys
from io import StringIO
import unittest
import os
import math

# 再帰処理上限(dfs作成時に設定するのが面倒なので限度近い値を組み込む)
sys.setrecursionlimit(999999999)


# 実装を行う関数
def resolve(test_def_name=""):
    n, k = map(int, input().split())
    a_s = list(map(int, input().split()))

    right = 1000000001
    left = 0

    # ループ数に意味はない
    for i in range(100):

        if left + right == 0:
            break

        middle = (left + right) // 2

        # middleより長い木を切る(切るべき回数の合計を取得する)
        cnt = 0
        for a in a_s:
            if a > middle:
                # 4/2 = 2    なら1回切る必要がある
                # 4/3 = 1.33 なら1回切る必要がある
                # 7/3 = 2.33 なら2回切る必要がある
                cnt += math.ceil(a / middle) - 1

        if cnt < k:
            # 最大値を下げる=小さい方に寄せる
            right = middle
        elif cnt > k:
            # 最小値を上げる=大きい方に寄せる
            left = middle
        else:
            # 最大値を下げる=小さい方に寄せる
            right = middle

    print(middle + 1)


# テストクラス
class TestClass(unittest.TestCase):
    def assertIO(self, assert_input, output):
        stdout, sat_in = sys.stdout, sys.stdin
        sys.stdout, sys.stdin = StringIO(), StringIO(assert_input)
        resolve(sys._getframe().f_back.f_code.co_name)
        sys.stdout.seek(0)
        out = sys.stdout.read()[:-1]
        sys.stdout, sys.stdin = stdout, sat_in
        self.assertEqual(out, output)

    def test_input_1(self):
        test_input = """2 3
7 9"""
        output = """4"""
        self.assertIO(test_input, output)

    def test_input_2(self):
        test_input = """3 0
3 4 5"""
        output = """5"""
        self.assertIO(test_input, output)

    def test_input_3(self):
        test_input = """10 10
158260522 877914575 602436426 24979445 861648772 623690081 433933447 476190629 262703497 211047202"""
        output = """292638192"""
        self.assertIO(test_input, output)

    # 自作テストパターンのひな形(利用時は「tes_t」のアンダーバーを削除すること
    def tes_t_1original_1(self):
        test_input = """データ"""
        output = """データ"""
        self.assertIO(test_input, output)


# 実装orテストの呼び出し
if __name__ == "__main__":
    if os.environ.get("USERNAME") is None:
        # AtCoder提出時の場合
        resolve()

    else:
        # 自PCの場合
        unittest.main()

Buggy submission (verdict: Runtime Error):
import sys
from io import StringIO
import unittest
import os
import math

# 再帰処理上限(dfs作成時に設定するのが面倒なので限度近い値を組み込む)
sys.setrecursionlimit(999999999)


# 実装を行う関数
def resolve(test_def_name=""):
    n, k = map(int, input().split())
    a_s = list(map(int, input().split()))

    right = 1000000001
    left = 0

    # ループ数に意味はない
    for i in range(100):
        middle = (left + right) // 2

        # middleより長い木を切る(切るべき回数の合計を取得する)
        cnt = 0
        for a in a_s:
            if a > middle:
                # 4/2 = 2    なら1回切る必要がある
                # 4/3 = 1.33 なら1回切る必要がある
                # 7/3 = 2.33 なら2回切る必要がある
                cnt += math.ceil(a / middle) - 1

        if cnt < k:
            # 最大値を下げる=小さい方に寄せる
            right = middle
        elif cnt > k:
            # 最小値を上げる=大きい方に寄せる
            left = middle
        else:
            # 最大値を下げる=小さい方に寄せる
            right = middle

    print(middle + 1)


# テストクラス
class TestClass(unittest.TestCase):
    def assertIO(self, assert_input, output):
        stdout, sat_in = sys.stdout, sys.stdin
        sys.stdout, sys.stdin = StringIO(), StringIO(assert_input)
        resolve(sys._getframe().f_back.f_code.co_name)
        sys.stdout.seek(0)
        out = sys.stdout.read()[:-1]
        sys.stdout, sys.stdin = stdout, sat_in
        self.assertEqual(out, output)

    def test_input_1(self):
        test_input = """2 3
7 9"""
        output = """4"""
        self.assertIO(test_input, output)

    def test_input_2(self):
        test_input = """3 0
3 4 5"""
        output = """5"""
        self.assertIO(test_input, output)

    def test_input_3(self):
        test_input = """10 10
158260522 877914575 602436426 24979445 861648772 623690081 433933447 476190629 262703497 211047202"""
        output = """292638192"""
        self.assertIO(test_input, output)

    # 自作テストパターンのひな形(利用時は「tes_t」のアンダーバーを削除すること
    def tes_t_1original_1(self):
        test_input = """データ"""
        output = """データ"""
        self.assertIO(test_input, output)


# 実装orテストの呼び出し
if __name__ == "__main__":
    if os.environ.get("USERNAME") is None:
        # AtCoder提出時の場合
        resolve()

    else:
        # 自PCの場合
        unittest.main()