bongbbi   3년 전

지금 2주째 나무랑 씨름중인데, 제출하자마자 바로 시간초과 뜨고있습니다....

정말 절실하게 도움이 필요합니다.

제가 짠 소스에서 어떤부부분을 고쳐야 시간 초과를 해결할 수 있는지 궁금합니다.

만약 더 줄일 수 없으면 아예 다른 방법으로 바꿔야하는지도 여쭤보고 싶습니다.

부탁드립니다...ㅠㅠㅠ

pl0892029   3년 전

0ms 으로 풀지는 못했지만, 일단(?) 풀려서 답변 드립니다.

동적 계획법으로 접근해봅시다. 같은 구역에 있는, 같은 나이의 나무들은 따로 분리해서 생각할 이유가 없습니다.

따라서

tree[x][y][age] = (x,y)좌표에 있는 age의 나이를 가진 나무의 수

로 일괄적으로 처리할 수 있습니다.

K <= 1000 이고, 1 <= x, y <= N 이며 age는 최악의 나이를 계산하면 됩니다.

시간복잡도는 O(K * N^2 * age) 로 푸실 수 있습니다.

bongbbi   3년 전

말씀해주신대로, 3차원배열로 x,y 좌표에 나이별 나무 개수를 따로 저장하니 해결이 되었네요! 감사합니다

단순히 모든나무에 대해서 list로 저장해 구현했었는데, 시간차이가 많이나는가봅니다..ㅠㅠ

jjack1234   3년 전

저는 내림차순으로 한번만 sort시켜서 vector를 stack처럼 사용하니 sorting에 시간을 많이 안써도 되서 시간초과를 없앨 수 있었습니다.

vector > tree(101, vector(0));

//simulation

for (int i = 0; i < k; i++) {
//spring & summer
for (int j = 0; j < n*n; j++) {
int r = j / n;
int c = j % n;
if (tree[j].empty()) { continue; }

int erase_idx = - 1;
for (int k = tree[j].size() - 1; k >= 0; k--) {
if (current[r][c] < tree[j][k]) { //양분 없으니 erase_idx부터의 나무는 다 죽게됨.
erase_idx = k;
break;
}
current[r][c] -= tree[j][k]; //자기 나이만큼 양분 감소
tree[j][k]++; //나이 한살 더먹음.
}
//summer
for (int k = erase_idx; k >= 0; k--) {
current[r][c] += tree[j][k] / 2;
tree[j].erase(tree[j].begin() + k);
}
}

//autumn
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
int idx = j * n + k;
if (tree[idx].empty()) { continue; }
for (int itr = 0; itr < tree[idx].size(); itr++) {
if (tree[idx][itr] % 5 == 0) {
bool row_1 = (j-1 >= 0);
bool row_2 = (j+1 < n);
bool col_1 = (k-1 >= 0);
bool col_2 = (k+1 < n);
if(row_1) {
if (col_1) {
tree[idx - n - 1].push_back(1);
}
tree[idx - n].push_back(1);
if (col_2) {
tree[idx - n + 1].push_back(1);
}
}
if (col_1) {
tree[idx - 1].push_back(1);
}
if (col_2) {
tree[idx + 1].push_back(1);
}
if (row_2) {
if (col_1) {
tree[idx + n -1].push_back(1);
}
tree[idx + n].push_back(1);
if (col_2) {
tree[idx + n + 1].push_back(1);
}
}
}
}
}
}

//winter
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
current[j][k] += add[j][k];
}
}

}

3차원 배열도 좋은 방법 같은데, age만큼 메모리를 엄청 잡아놓고 써야 되는 것 아닌가요??

댓글을 작성하려면 로그인해야 합니다.