白駿-16235木材財テク
30438 ワード
木材財テク問題リンク
問題の説明
樹木は毎年以下の過程を経る時、K年後の活樹の数を求める.
四季春:自分の年齢で養分を食べ、年齢を1歳増やす
一室にいくつもあり、幼木から養分をいただきます
養分が足りなければ、いっそ養分を食べないで、すぐに死んでしまう. 夏:春に死んだ木が養分になる(木の年齢/2) 秋:年齢5倍の樹木が隣接する8マスのうち、年齢1の繁殖 冬季:A[r][c]と同じ養分を1室ずつ添加 条件 1 ≤ N ≤ 10 1 ≤ M ≤ N2 1 ≤ K ≤ 1,000 1 ≤ A[r][c] ≤ 100 1≦与えられた木の年齢≦10を入力 入力されたツリーの位置が異なる 一間に複数の木がある場所 最初は1室あたり5等量の養分があった に答える
問題のように、春、夏、秋、冬を実現していますが、タイムアウトします.
初めての試み
結果
コード#コード#
アイデア
四季を问わず、一度にできる仕事をしばってしまった.
木の年齢昇順ソートを前提として,次のような操作を行った.
ただし、pypyのみが通過します.
コード#コード#
アイデア
結果
コード#コード#
問題の説明
樹木は毎年以下の過程を経る時、K年後の活樹の数を求める.
四季
一室にいくつもあり、幼木から養分をいただきます
養分が足りなければ、いっそ養分を食べないで、すぐに死んでしまう.
問題のように、春、夏、秋、冬を実現していますが、タイムアウトします.
初めての試み
結果
コード#コード#
import sys
read = sys.stdin.readline
# 나무가 번식할 수 있는 위치를 구하기 위한 배열
drdc = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]
# N: 땅의 크기, M: 나무의 수, K: 연도 수
N, M, K = map(int, read().split())
land = [[5] * N for _ in range(N)]
# A: 겨울에 추가할 양분
A = [list(map(int, read().strip().split())) for _ in range(N)]
trees = []
for _ in range(M):
# x,y: 나무의 위치, z: 나무의 나이
x, y, z = map(int, read().split())
trees.append([z, x - 1, y - 1])
# 나무의 나무가 적은 순서로 정렬한다
trees.sort()
for _ in range(K): # K년만큼 반복
# 봄
dead_trees = []
for index in range(len(trees)): # 나무별로 반복
age, r, c = trees[index]
if land[r][c] < age: # 양분이 부족하면
dead_trees.append((index, age // 2, r, c))
else: # 양분이 충분하면
land[r][c] -= age
trees[index][0] += 1
# 여름
# 뒤의 인덱스부터 제거해주어야 한다
for i in range(len(dead_trees) - 1, 0 - 1, -1):
index, value, r, c = dead_trees[i]
land[r][c] += value
del trees[index]
# 가을
new_trees = []
for age, r, c in trees:
if age < 5 or age % 5 != 0:
continue
for dr, dc in drdc:
dr, dc = r + dr, c + dc
if 0 <= dr < N and 0 <= dc < N:
new_trees.append([1, dr, dc])
trees.extend(new_trees)
trees.sort()
# 겨울
for r in range(N):
for c in range(N):
land[r][c] += A[r][c]
print(len(trees))
2回目の試みアイデア
四季を问わず、一度にできる仕事をしばってしまった.
木の年齢昇順ソートを前提として,次のような操作を行った.
--- 각 위치별로 반복 시작 ---
is_lack - True: 양분 부족, False: 양분 부족하지 않음
False: 한 위치에서 나이가 어린 순으로 양분을 먹고, 나이 1 증가
나이가 5의 배수라면 breed_trees에 추가
True: add_val += 나이 // 2
land[r][c] += add_val + A[r][c]
--- 각 위치별로 반복 종료 ---
breed_trees 번식
結果ただし、pypyのみが通過します.
コード#コード#
from collections import defaultdict
import sys
read = sys.stdin.readline
def do(r, c):
is_lack = False # 현재 위치 양분 부족 여부
add_val = 0 # 현재 위치에서 죽은 나무가 양분이 되어 더할 수
new_trees = [] # 이번 작업이 끝난 뒤 (r, c) 에 위치한 나무들
trees[(r, c)].sort() # 나이 오름차순으로 정렬
for age in trees[(r, c)]:
if land[r][c] < age:
is_lack = True
if is_lack: # 현재 위치의 양분이 부족하다면
add_val += age // 2
else: # 양분이 부족하지 않다면
land[r][c] -= age
age += 1
new_trees.append(age)
if age % 5 == 0:
breed_trees.append((r, c))
trees[(r, c)] = new_trees
return add_val
# 나무가 번식할 수 있는 위치를 구하기 위한 배열
drdc = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]
# N: 땅의 크기, M: 나무의 수, K: 연도 수
N, M, K = map(int, read().split())
land = [[5] * N for _ in range(N)]
# A: 겨울에 추가할 양분
A = [list(map(int, read().strip().split())) for _ in range(N)]
trees = defaultdict(list)
for _ in range(M):
# x,y: 나무의 위치, z: 나무의 나이
x, y, z = map(int, read().split())
trees[(x - 1, y - 1)].append(z)
for _ in range(K):
# 각 위치별로 반복
breed_trees = [] # 번식할 나무들
for r in range(N):
for c in range(N):
add_val = 0
if (r, c) in trees:
add_val = do(r, c)
land[r][c] += add_val + A[r][c]
if not trees[(r, c)]:
del trees[(r, c)]
# 나무 번식
for r, c in breed_trees:
for dr, dc in drdc:
dr, dc = r + dr, c + dc
if 0 <= dr < N and 0 <= dc < N:
trees[(dr, dc)].append(1)
print(sum(map(len, trees.values())))
3回目の試みアイデア
結果
コード#コード#
Reference
この問題について(白駿-16235木材財テク), 我々は、より多くの情報をここで見つけました https://velog.io/@hengzizng/BaekJoon-16235テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol