木材財テク(16235)
サムスン機能のテスト-実装
def ongoing(nutrition, tree, plus):
tree.sort()
# 봄
for i in range(len(tree)):
if nutrition[tree[i][0] - 1][tree[i][1] - 1] >= tree[i][2]: # 나이보다 큰 양분이 있을 때
nutrition[tree[i][0] - 1][tree[i][1] - 1] -= tree[i][2] # 나무 나이만큼 양분 차감
tree[i][2] += 1 # 해당 나무 나이 + 1
else: # 나이보다 양분이 작을 때
tree[i][3] = 0 # 살았다 -> 죽었다 전환
# 여름
for i in range(len(tree)):
if tree[i][3] == 0: # 반복문에서 idx = 3 죽은 나무 조회
nutrition[tree[i][0] - 1][tree[i][1] - 1] += (int(tree[i][2] / 2)) # 죽은 나무 나이 2로 나눈만큼 양분 추가
# 가을
newTreeArray = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]] # 번식 나무 8개 범위
for i in range(len(tree)):
if tree[i][2] % 5 == 0: # 해당 나무 나이가 5배수일 때
for j in range(len(newTreeArray)): # 주변 8개에 새로운 나무 심기
if (0 <= tree[i][0] + newTreeArray[j][0] < len(nutrition)) and (0 <= tree[i][1] + newTreeArray[j][1] < len(nutrition))
newTree = [tree[i][0] + newTreeArray[j][0], tree[i][1] + newTreeArray[j][1], 1, 1]
tree.append(newTree)
# 겨울
for i in range(len(nutrition)):
for j in range(len(nutrition)):
nutrition[i][j] += plus[i][j]
def solution(relation):
k = 4
tree = [[2, 1, 3, 1], [3, 2, 3, 1]] # 각 배열 마지막은 1 : 살았다, 0 : 죽었다
nutrition = [[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5]]
plus = [[2, 3, 2, 3, 2],
[2, 3, 2, 3, 2],
[2, 3, 2, 3, 2],
[2, 3, 2, 3, 2],
[2, 3, 2, 3, 2]]
for i in range(k):
ongoing(nutrition, tree, plus)
return True
年齢比較は実施していない.import sys
input = sys.stdin.readline
N, M, K = map(int, input().split())
# N 활용 -> A(영양분), tree 배열
A = [list(map(int, input().split())) for i in range(N)]
tree = [[[] for _ in range(N)] for _ in range(N)]
ground = [[5] * N for i in range(N)] # 기본 양분 5씩 셋팅
for i in range(M): # 크리티컬한 부분. 나무 나이 대소비교를 위한 장치
x, y, z = map(int, input().split())
tree[x - 1][y - 1].append(z) # 나이를 배열에 넣는다
for x in range(K):
# 봄
for i in range(N):
for j in range(N):
if len(tree[i][j]) <= 0:
continue
tree[i][j].sort() # 가장 어린 나무에게 양분 공급용
idx = 0
while idx < len(tree[i][j]):
if tree[i][j][idx] <= ground[i][j]:
ground[i][j] -= tree[i][j][idx] # 나이만큼 양분 먹기
tree[i][j][idx] += 1 # 트리 나이 한살 먹기
idx += 1 # 그 다음 나이 많은 나무로 반복문 진행
else:
die = tree[i][j][idx:] # 양분 부족 -> 못먹은 나무들
for t in die:
ground[i][j] += (t // 2)
tree[i][j] = tree[i][j][:idx] # 살아 있는 나무만 그 칸에 남긴다.
break
# 가을
di = [[-1, 0], [0, -1], [1, 0], [0, 1], [1, 1], [1, -1], [-1, 1], [-1, -1]]
for i in range(N):
for j in range(N):
c = 0
if tree[i][j]: # tree[i][j]번째에 존재하는 모든 나무들 조회
for now in tree[i][j]:
if now % 5 == 0:
c += 1
if c > 0:
for k in range(8): # 주변 8개 구역 나무 번식
ni = i + di[k][0]
nj = j + di[k][1]
# 항상 범위, 구역 넘는지 체크하는거 중요
if (0 <= ni < N) and (0 <= nj < N):
for y in range(c): # 그 자리에 나무기 있는 갯수(m) 만큼 새로운 나무를 추가한다.
tree[ni][nj].append(1) # 나이 1살짜리 나무 추가
# 겨울
for i in range(N):
for j in range(N):
ground[i][j] += A[i][j]
answer = 0
for i in range(N):
for j in range(N):
answer += len(tree[i][j])
print(answer)
解決できない原因+)並べ替えにより,幼木を0位にし,大きさで養分を食べる木と食べられない木を区別する
1)春季の幼木への栄養供給部分
2)最小の木1本だけが養分を食べていると勘違いする->養分が十分であれば多くの木を植えることができる
3)デッドツリー[:idx]で処置し,デッドツリーでバリアを更新する(tree[i][j]).
4)この欄の活樹数(c)により,周辺8欄に1歳の木を増やす.ex)c=5の場合、周囲に40本の木が8マス5本
参照)
https://daimhada.tistory.com/114
https://yeoping.tistory.com/26
Reference
この問題について(木材財テク(16235)), 我々は、より多くの情報をここで見つけました https://velog.io/@skkfea07/백준-나무-재테크16235テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol