本を分かち合う


質問リンク


本を分かち合う

コード#コード#

T = int(input())

for test_case in range(T):
    num_list = list(map(int, input().split()))
    book = num_list[0]
    students = num_list[1]

    student_list = []
    book_list = []
    max_total_student = 0
    for books in range(1,book+1):
        book_list.append(books)

    for student in range(students):
        num_list = list(map(int, input().split()))
        #idx = num_list[1] - num_list[0]
        student_list.append(num_list)

    student_list.sort(key = lambda x:x[1])

    for student in student_list:
        min_book = student[0]
        max_book = student[1]

        for i in range(min_book, max_book+1):
            if i in book_list:
                book_list.remove(i)
                max_total_student+=1
                break

    print(max_total_student)

問題特殊事項


  • 最初はBackTrackで解いてみました.

  • 入れられる最小番号から、入れられる最大番号を全て+入れない

  • 再帰エラーが発生する回数が多すぎます

  • 2つ目の方法はabs、すなわちminbookとmaxbookのサイズが最も小さい順に並べ替えて入れてみることです.

  • ほとんどのケースは解決されましたが、次の場合にエラーが発生します.
    1
    4 4
    1 2
    2 3
    3 4
    1 3

  • 最後にmaxbookの順番で並べ替え、入れるときはまずminbookを入れます.