대출 스케줄링

시간 제한1초메모리 제한128 MB

요약
마감 시한과 이익이 있는 대출 신청들 중, 시간당 처리 용량 제한을 지키면서 마감 전에 배정 가능한 최대 이익의 부분집합을 구합니다.
난이도

보통10점 중 6점

유형
그리디, 정렬, 유니온 파인드
정답자
아직 제출이 없습니다

문제

은행은 어떤 대출 신청을 승인할지 결정해야 합니다. 신청들의 집합 AppApp이 있고, 각 신청 a∈Appa \in App에는 승인 마감 시각 dad_a가 있습니다. 신청 aa를 승인하면 요청된 대출을 0≤ta≤da0 \le t_a \le d_a를 만족하는 정수 시각 tat_a에 지급해야 하며, 승인 시 은행은 이익 pap_a를 얻습니다.

시간은 은행이 모든 신청을 한꺼번에 결정하는 시각 00부터 정수 단위로 측정됩니다. 은행은 임의의 한 시각에 최대 LL건의 대출만 지급할 수 있습니다. 은행의 목표는 오직 이익을 최대화하는 것으로, 승인한 각 대출을 마감 시각 이내의 시간 슬롯(각 시간 단위에는 최대 LL건의 지급이 가능)에 배정할 수 있다는 조건 아래에서 profit(S)=∑a∈Spa\text{profit}(S) = \sum_{a \in S} p_a를 최대로 하는 부분집합 S⊆AppS \subseteq App를 고릅니다. 은행이 얻을 수 있는 최대 이익을 구하세요. 여러 개의 데이터 집합을 입력 텍스트 파일에서 읽어 처리하는 프로그램을 작성하세요.

예를 들어 L=1L = 1이고 네 개의 신청 (pa,da)=(4,2)(p_a, d_a) = (4, 2), (pb,db)=(1,0)(p_b, d_b) = (1, 0), (pc,dc)=(2,0)(p_c, d_c) = (2, 0), (pd,dd)=(3,1)(p_d, d_d) = (3, 1)이 있을 때를 생각해 봅시다. 아래 표는 승인 가능한 모든 신청 집합과 대출 지급 일정을 보여 줍니다. 가장 높은 이익은 99이며 집합 {a,c,d}\{a, c, d\}에 대응합니다. 신청 cc의 대출은 시각 00에, dd는 시각 11에, aa는 시각 22에 지급합니다.

시각
0abcdbcbbccddabc
1adddaaadddd
2aaaaaaa
이익4441233455566777789

입력

입력에는 여러 개의 데이터 집합이 연달아 주어지며, 파일의 끝에서 종료됩니다. 각 데이터 집합은 두 정수 NN (0≤N≤100000 \le N \le 10000, 신청의 개수)과 LL (0≤L≤1000 \le L \le 100, 은행이 한 시각에 지급할 수 있는 대출의 최대 개수)로 시작합니다. 이어서 NN개의 정수 쌍 pi dip_i\ d_i (0≤pi≤100000 \le p_i \le 10000, 0≤di≤100000 \le d_i \le 10000)가 주어지며, 각각 신청 ii의 이익과 마감 시각을 나타냅니다. 입력 데이터는 공백으로 구분되고, 항상 올바르며, 파일의 끝에서 종료됩니다.

출력

각 데이터 집합마다 승인한 신청으로부터 은행이 얻을 수 있는 최대 이익을 표준 출력의 한 줄에 하나씩, 줄 맨 앞부터 출력합니다. 빈 줄은 출력하지 않습니다.

예제1

  1. 예제 1

    입력
    4 1     4 2  1 0   2 0   3 1
    7 2
    200 1   200 1   100 0  1000 2   80 1
    50 20   500 1
    0 100
    1 0     4 1000
    
    예상 출력
    9
    2050
    0
    0