목표 : 카카오 코드 페스티벌 2018 예선 E, F번 풀기
https://www.acmicpc.net/problem/15957
해결 방법
> 입력을 받아 트리를 그린다.
> 각 노드의 서브트리의 노드 개수를 구한다.(가중치를 나누기 위함)
> dfs를 돌면서 가중치를 적용시킨다.
> 트리를 순회하면서 가중치가 목표 점수에 도달하면 걸린시간을 체크한다.
결과
> 시간 초과
> 내가 생각한 이유 : 노드의 개수가 10만개인데 내가 짠 코드는 dfs를 10만번 돌고 또 돌아야 하기 떄문에 시간초과가 난 것 같다.
코드
import sys
from collections import defaultdict
sys.setrecursionlimit(10 ** 6)
def DFS_visit(adj, u, visited):
if num_subnode[u] != None:
return
visited.append(u)
for v in adj[u]:
if v not in visited:
DFS_visit(adj, v, visited)
def DFS(adj, s):
visited =[]
DFS_visit(adj, s, visited)
num_subnode[s] = len(visited)
def DFS_visit_cal(adj, u, visited, time, w):
visited.append(u)
index = result[u - 1][2] - 1
if not check[index]:
result[u - 1][1] += w
if (result[u - 1][1] // singer_count[result[u - 1][2]]) >= target_score:
check[index] = True
output[result[u - 1][2]] = time
for v in adj[u]:
if v not in visited:
DFS_visit_cal(adj, v, visited, time, w)
def DFS_cal(adj, s, time, w):
visited =[]
DFS_visit_cal(adj, s, visited, time, w)
musictree = defaultdict(set)
num_music, num_data, target_score = map(int, input().split())
parent_node = list(map(int, input().split()))
parent_node.insert(0,0)
#가수 처리
singer = list(map(int, input().split()))
singer_count = defaultdict(int)
for i in singer:
singer_count[i] += 1
for i in range(1, num_music + 1):
for j in range(num_music):
if parent_node[j] == i:
musictree[i].add(j + 1)
num_subnode = list(None for i in range(num_music + 1)) #서브트리의 노드 개수
for i in range(1, num_music + 1):
DFS(musictree,i)
result = list()
for i in range(num_music):
result.append([0,0,singer[i]]) #시간, 가중치, 가수
check = [False for i in range(num_music)]
output = defaultdict(lambda: -1)
for i in range(num_music):
time, subtree, weight = map(int, input().split())
DFS_cal(musictree, subtree, time, weight//num_subnode[subtree])
for i in singer:
print(output[i])
https://www.acmicpc.net/problem/15958
해결 방법
> 히스토그램을 y축의 변화를 기준으로 직사각형으로 나눈다.
> x변의 최대값과 y변의 최솟값을 구한다.
> 조건을 달아 연산하면 될 것 같다.
음악추천에 시간을 너무 많이 써서 위의 단계에서 끝났다.
'CNU 학습 동아리 > 2020 동계 학습 동아리' 카테고리의 다른 글
2020 동계 학습 동아리_7회차_2020-02-17(월) (0) | 2020.02.18 |
---|---|
2020 동계 학습 동아리_5회차_2020-02-11(화) (0) | 2020.02.12 |
2020 동계 학습 동아리_4회차_2020-02-10(월) (0) | 2020.02.10 |
2020 동계 학습 동아리_3회차_2020-02-07(금) (0) | 2020.02.07 |
2020 동계 학습 동아리_2회차_2020-02-04(화) (0) | 2020.02.04 |
댓글