Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 재귀
- 문자열
- 브루트포스
- DFS
- 누적 합
- 자료구조
- 그리디 알고리즘
- Unreal Engine 5
- c++
- XR Interaction Toolkit
- 알고리즘
- 백트래킹
- 그래프
- 다익스트라
- 다이나믹 프로그래밍
- 투 포인터
- 유니온 파인드
- VR
- 구현
- 수학
- ue5
- Team Fortress 2
- 트리
- 유니티
- 스택
- 우선순위 큐
- 정렬
- 백준
- BFS
- 시뮬레이션
Archives
- Today
- Total
1일1알
백준 16235번 나무 재테크 C++ 본문
처음에 입력을 받고 나무의 나이 순서대로 정렬한다.
봄에는 나이가 적은 순서대로 양분을 먹다가 만약 양분이 부족하면 뒤에 나무들을 전부 죽이고 죽은 나무에서 나오는 양분을 저장하는 배열에 나이/2만큼 저장한다. 이 때 배열의 뒤에서부터 죽였다. 뒤에서 죽이면 O(1)에 죽일 수 있지만 앞에서부터 죽이면 O(n)의 비용이 들기 때문이다.
가을에는 처음에 모든 나무들을 reverse 해서 새로 생긴 나무를 뒤에 push_back으로 놓어주고 모든 작업이 끝나면 다시 reverse 해주었다. 이렇게 하는 이유는 새로 생긴 나무는 나이가 무조건 1이기 때문에 제일 어릴 수밖에 없다. 그래서 처음에 뒤집고 새로 생긴 것을 넣어주고 다시 뒤집으면 따로 정렬을 안해줘도 되기 때문이다.
(근데 굳이 이렇게 안해도 될듯)
겨울에는 처음에 입력받은 양분을 더해주었다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
using namespace std;
using ll = long long;
int n, m, k;
int dRow[8] = { -1,-1,0,1,1,1,0,-1 };
int dCol[8] = { 0,1,1,1,0,-1,-1,-1 };
vector<vector<int>> board(11, vector<int>(11, 5));
vector<vector<vector<int>>> trees(11, vector<vector<int>>(11, vector<int>()));
vector<vector<int>> deadTrees(11, vector<int>(11, 0));
vector<vector<int>> A(11, vector<int>(11));
void Sort() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
sort(trees[i][j].begin(), trees[i][j].end());
}
}
}
void TreeDie(int row, int col, int size) {
for (int i = 0; i < size; i++) {
deadTrees[row][col] += trees[row][col].back() / 2;
trees[row][col].pop_back();
}
}
void Spring() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 0; k < trees[i][j].size(); k++) {
if (board[i][j] >= trees[i][j][k]) {
board[i][j] -= trees[i][j][k];
trees[i][j][k]++;
}
else {
TreeDie(i, j, trees[i][j].size() - k);
break;
}
}
}
}
}
void Summer() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
board[i][j] += deadTrees[i][j];
deadTrees[i][j] = 0;
}
}
}
void Fall() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (trees[i][j].size() == 0) continue;
reverse(trees[i][j].begin(), trees[i][j].end());
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (trees[i][j].size() == 0) continue;
for (auto tree : trees[i][j]) {
if (tree % 5 != 0) continue;
for (int k = 0; k < 8; k++) {
int nextRow = i + dRow[k];
int nextCol = j + dCol[k];
if (nextRow<1 || nextRow>n) continue;
if (nextCol<1 || nextCol>n) continue;
trees[nextRow][nextCol].push_back(1);
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (trees[i][j].size() == 0) continue;
reverse(trees[i][j].begin(), trees[i][j].end());
}
}
}
void Winter() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
board[i][j] += A[i][j];
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> A[i][j];
}
}
for (int i = 0; i < m; i++) {
int x, y, z;
cin >> x >> y >> z;
trees[x][y].push_back(z);
}
Sort();
for (int i = 0; i < k; i++) {
Spring();
Summer();
Fall();
Winter();
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cnt += trees[i][j].size();
}
}
cout << cnt;
};
'알고리즘' 카테고리의 다른 글
백준 17144번 미세먼지 안녕! C++ (0) | 2022.05.25 |
---|---|
백준 1655번 가운데를 말해요 C++ (0) | 2022.05.24 |
백준 12100번 2048 (Easy) C++ (0) | 2022.05.21 |
백준 1600번 말이 되고픈 원숭이 C++ (0) | 2022.05.20 |
백준 11559번 Puyo Puyo C++ (0) | 2022.05.19 |