10836번: 여왕벌
입력의 첫 줄에는 격자칸의 가로와 세로 크기 M(2 ≤ M ≤ 700)과 날짜 수 N(1 ≤ N ≤ 1,000,000)이 자연수로 주어진다. 첫날 아침의 애벌레 크기는 모두 1이므로 입력에 주어지지 않는다. 다음 N개의 ��
www.acmicpc.net
1. 처음에 아무생각없이 직관적으로 풀었다가 시간초과가 떠버렸다....
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m; // 크기, 날짜 수
int map[701][701];
int map_before[701][701];
int datas[3];
int biggest_growth(int i, int j)
{
int result = 0;
result = max(result, map[i-1][j-1] - map_before[i - 1][j - 1]);
result = max(result, map[i][j-1] - map_before[i][j - 1]);
result = max(result, map[i-1][j] - map_before[i - 1][j]);
return result; //주변 중 가장 크게 자란 곳!
}
int add(int index)
{
if (index <= datas[0])
{
return 0;
}
else if (index > datas[0] && index <= (datas[0] + datas[1]))
{
return 1;
}
else if (index > (datas[0] + datas[1]) && index <= (datas[0]+datas[1] + datas[2]))
{
return 2;
}
}
void growth()
{
// (1,1) 부터 (m-1,m-1) 까지
// 행 1부터 m-1까지
for (int i = 1; i < m; i++)
{
for (int j = 1; j < m; j++)
{
map_before[i][j] = map[i][j];
map[i][j] += biggest_growth(i, j);
}
}
}
int main()
{
cin >> m >> n;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
map[i][j] = 1; //처음에는 다 1
}
}
for (int i = 0; i < n; i++)//각 일 수
{
int index = 1;
for (int k = 0; k < 3; k++)
{
cin >> datas[k];
}
// 정해지는 애들 미리 성장시키기
for (int j = m - 1; j >= 0; j--)
{
map_before[j][0] = map[j][0];
map[j][0] += add(index++);
}
for (int j = 1; j < m; j++)
{
map_before[0][j] = map[0][j];
map[0][j] += add(index++);
}
//나머지 차근차근 성장해나가기
growth();
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
cout << map[i][j] << " ";
}
cout << endl;
}
return 0;
}
2. 블로그 검색후 수정
- 애벌레가 매번 성장할때 마다 갱신해버리면 O(M^2) 라 시간초과 떠버림
- 증가율을 저장해 놨다가 한번에 갱신하자
- 우리가 미리 정해주는 맨 왼쪽 열과 맨 위쪽 행 말고는 map자기 위에 값으로 갱신됨!!
난 이걸 생각치도 못했다....ㅎ
참고:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[701][701];
int outside[1500];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= 2 * n - 1; i++)
{
outside[i] = 1;
}
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
for (int i = a + 1; i <= a + b; i++)
outside[i] += 1;
for (int i = a + b + 1; i <= 2 * n - 1; i++)
outside[i] += 2;
}
int row = n;
int col = 1;
for (int i = 1; i <= 2 * n - 1; i++)
{
if (row == 1)
{
arr[row][col] = outside[i];
col++;
}
else
{
arr[row][col] = outside[i];
row--;
}
}
for (int i = 2; i <= n; i++)
{
for (int j = 2; j <= n; j++)
arr[i][j] = arr[1][j];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
cout << arr[i][j] << " ";
cout << endl;
}
}
'c++ > Baekjoon Online' 카테고리의 다른 글
백준 9205 : 맥주마시면서 걸어가기 c++ (0) | 2020.09.06 |
---|---|
백준 15684 : 사다리 조작 C++ (0) | 2020.09.06 |
백준 13458 : 시험 감독 c++ (0) | 2020.09.06 |
백준 10040: 투표 c++ (0) | 2020.09.06 |
백준 1713: 후보 추천하기 c++ (0) | 2020.09.06 |