# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
659432 | pizet | Job Scheduling (CEOI12_jobs) | Pypy 3 | 1094 ms | 65536 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#!/usr/bin/env python3
import math
import sys
input = lambda: sys.stdin.readline().rstrip("\r\n")
def test_case():
n, d, m = map(int, input().split())
jobs = []
cnt = [0 for _ in range(n+1)]
i = 1
for x in input().split():
jobs.append([int(x), i])
cnt[jobs[-1][0]] += 1
i += 1
jobs.sort()
# print(jobs)
def cond(x):
max_d = 0
j = 0
for i in range(1, n+1):
curr = 0
while j < m and curr < x and jobs[j][0] <= i:
# print(i, jobs[j])
max_d = max(max_d, i-jobs[j][0])
if max_d > d: return False
curr += 1
j += 1
# print(x, max_d)
# print("=======")
return True
def cond2(x):
req_num = 0
schedule = [[] for _ in range(n)]
for day in range(1, n+1):
for j in range(x):
if jobs[req_num][0] > day:
break
if jobs[req_num][0] + d >= day:
schedule[day-1].append(jobs[req_num][1])
req_num += 1
else:
return False, schedule
if req_num == m:
return True, schedule
return False, schedule
def discrete_binary_search(func, lo, hi):
""" Locate the first value x s.t. func(x) = True within [lo, hi] """
res = []
while lo < hi:
mi = lo + (hi - lo) // 2
res1, res2 = func(mi)
if res1:
hi = mi
res = res2
else:
lo = mi + 1
return lo, res
ans, res = discrete_binary_search(cond2, 1, m)
print(ans)
for i in range(n):
if len(res[i]) > 0:
print(*res[i], end=' ')
print(0)
else:
print(0)
def main():
t = 1
# t = int(input())
for _ in range(t):
test_case()
if __name__ == '__main__':
main()
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |