Softeer 업무처리 – 파이썬

문제

부서의 작업 조직은 완전한 이진 트리의 형태를 취합니다. 즉, 부서장이 루트이고, 부서장을 비롯한 각 직원에게는 좌우로 부하가 있습니다. 부하 직원이 없는 직원을 부하 직원이라고 합니다.

모든 하위 직원은 부서장으로 동일한 승진을 합니다. 조직도 트리의 높이는 H입니다. 아래는 높이가 1과 3인 조직도입니다.


작업은 R일 동안 실행됩니다. 처음에는 최하위 직원에게만 K개의 주문된 작업이 있습니다. 각 작업에는 작업 번호가 있습니다. 매일 남은 일이 있으면 부하가 일을 완성해 상사에게 제시한다. 보류 중인 작업에서 다른 직원은 업로드된 순서대로 작업을 수행하고 상사에게 업로드합니다. 단, 홀수일에는 왼쪽 하위가 게시한 작업이 처리되고, 짝수일에는 오른쪽 하위가 게시한 작업이 처리됩니다.

부서장 업무가 완료되었습니다. 모든 작업은 동시에 이루어집니다. 따라서 상사는 그날 올린 작업을 다음날까지 처리할 수 있다.

주어진 부서의 조직과 대기열에 있는 작업이 완료된 작업 수의 합계를 계산하는 프로그램을 작성하십시오.

제한

1 ≤ 높이 ≤ 10

1 ≤ K ≤ 10

1 ≤ R ≤ 1,000

문제를 해결하다

이진 트리를 순회하여 지시대로 진행할 수 있는 문제입니다.

팀원들은 각 이진 트리의 위치에 배치되며, 인덱스가 홀수이면 오른쪽 부하가 할당한 작업이 증가하고, 짝수이면 에 부하가 할당한 작업이 저장됩니다. 왼쪽.

O 인덱스: 1

OO index : 2(짝수, 좌), index : 3(홀수, 우)

날짜가 홀수일 경우 왼쪽 부하가 인계합니다.

날짜가 짝수이면 오른쪽에 있는 부하가 인계합니다.

편집한 작업을 상사의 왼쪽 하위 작업 또는 오른쪽 부하 직원의 게시된 작업에 저장합니다.

지수가 1이 되면 부서장에게 일이 넘어가 처리되기 때문에 결과가 합산된다.

from collections import deque

class Employee:
    def __init__(self, height):
        if height == H:
            self.jobs = deque()
        else:
            self.leftJobs = deque()
            self.rightJobs = deque()

def team_set(index, height):
    if H < height:
        return

    team(index) = Employee(height)
    
    team_set(index * 2, height + 1)
    team_set(index * 2 + 1, height + 1)

def work(day, index, height):
    global result

    if height > H:
        return

    Employee = team(index)

    if height == H and Employee.jobs:
        job = Employee.jobs.popleft()

        if index % 2 == 0:
            team(index // 2).leftJobs.append(job)
        else:
            team(index // 2).rightJobs.append(job)

    elif height < H and day % 2 == 0 and Employee.rightJobs:
        job = Employee.rightJobs.popleft()

        if index == 1:
            result += job
        else:
            if index % 2 == 0:
                team(index // 2).leftJobs.append(job)
            else:
                team(index // 2).rightJobs.append(job)
    elif height < H and day % 2 == 1 and Employee.leftJobs:
        job = Employee.leftJobs.popleft()

        if index == 1:
            result += job
        else:
            if index % 2 == 0:
                team(index // 2).leftJobs.append(job)
            else:
                team(index // 2).rightJobs.append(job)

    work(day, index * 2, height + 1)
    work(day, index * 2 + 1, height + 1)

H, K, R = map(int, input().split())

team = (0) * (2 ** (H + 1))

result = 0

team_set(1, 0)

for i in range(2 ** H, 2 ** (H+1)):
    work_list = list(map(int, input().split()))
    team(i).jobs.extend(work_list)

# 일해라 R일 동안
for i in range(1, R+1):
    work(i, 1, 0)

print(result)