๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/17143
17143๋ฒ: ๋์์
๋์์์ด ์์ด ๋์๋ฅผ ํ๋ ๊ณณ์ ํฌ๊ธฐ๊ฐ R×C์ธ ๊ฒฉ์ํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ฒฉ์ํ์ ๊ฐ ์นธ์ (r, c)๋ก ๋ํ๋ผ ์ ์๋ค. r์ ํ, c๋ ์ด์ด๊ณ , (R, C)๋ ์๋ ๊ทธ๋ฆผ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋์ ์๋ ์นธ์ด๋ค.
www.acmicpc.net
๊ฐ ์์ด์ ์์น๋ฅผ ์กฐ์ ํ๋ ๊ตฌํ ๋ฌธ์ .
ํ์ด
๋์์์ ์ฒ์์ 1๋ฒ ์ด๋ณด๋ค ํ ์นธ ์ผ์ชฝ์ ์๋ค. ์ฆ 0๋ฒ์ด์ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๋์์์ ๋ ์๋ง ์๊ธฐ ๋๋ฌธ์ ํ์ ํญ์ 0๋ฒํ์ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. (0, 0) ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ์ฉ ์ด๋ํ๋ฉด์ ๋์๋ฅผ ํ๋ค. ๋์์์ด ํ ์นธ ์ด๋ํ ๋๋ง๋ค ์์ด๋ค๋ ์๋์ ๋ฐ๋ผ ์ด๋ํ๋ค.
1. ๋์์์ด ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ํ๋ค.
์ด๊ฑด ๊ทธ๋ฅ ๋์์์ x์ขํ๋ฅผ +1 ํด์ฃผ๋ฉด ๋๋ค.
2. ๋์์์ด ์๋ ์ด์ ์๋ ์์ด ์ค์์ ๋ ๊ณผ ์ ์ผ ๊ฐ๊น์ด ์์ด๋ฅผ ์ก๋๋ค. ์์ด๋ฅผ ์ก์ผ๋ฉด ๊ฒฉ์ํ์์ ์ก์ ์์ด๊ฐ ์ฌ๋ผ์ง๋ค.
๋์์์ด ์๋ ์ขํ์์ x์ขํ๋ ๊ณ ์ ํ ์ฑ y์ขํ๋ฅผ ํ๋์ฉ ๋๋ ค๊ฐ๋ฉฐ ๋ฌผ์์ผ๋ก ๋ด๋ ค๊ฐ๋ค. ์ฒ์์ผ๋ก ๋ง๋ ์์ด๊ฐ ๋ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์์ด์ด๋ค. ์ด ์์ด์ ํฌ๊ธฐ๋ฅผ ์ก์ ์์ด ํฌ๊ธฐ์ ํฉ(ans)์ ๋ํด์ฃผ๊ณ ์ด ์์ด๋ ๋ฒกํฐ์์ ์ญ์ ํ๋ค.
3. ์์ด๊ฐ ์ด๋ํ๋ค.
์ด ๋ฌธ์ ์ ๊ด๊ฑด์ ์์ด์ ์ด๋์ธ ๊ฒ ๊ฐ๋ค.
์์ด๋ง๋ค ์ผ์ ํ ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์์ด๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ด๋ํ๋ ค๊ณ ํ๋ฉด(๋ฒฝ์ ๋ฐ์ผ๋ฉด) ๋ฐฉํฅ์ ๋ฐ๊ฟ์ ํ ์นธ ์ด๋ํ๋ค. ๊ทธ๋ฐ๋ฐ ์์ด๋ฅผ ํ ์นธ ํ ์นธ ์ด๋์ํค๊ธฐ์๋ ์๊ฐ์ด ๋๋ฌด ์ค๋๊ฑธ๋ฆฐ๋ค.
์์ด์ ์๋ ฅ์ 1์ด ๋์ ์์ด๊ฐ "์ด๋ํด์ผํ ๊ฑฐ๋ฆฌ"์ ๊ฐ๋ค.
์ด๋ํด์ผํ ๊ฑฐ๋ฆฌ(distance)๊ฐ 0์ด ๋ ๋๊น์ง ์์ด๋ ์ด๋ํ๋ค.
์์์ ์์ด๊ฐ ํ์ฌ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ์. ์ด ์์ด๋ ์ค๋ฅธ์ชฝ ๋๋ ์ผ์ชฝ์ผ๋ก๋ง ์ด๋ํ๊ธฐ ๋๋ฌธ์ y์ขํ๋ ์ ๊ฒฝ์ฐ์ง ์๋๋ค.
ํ์ฌ ์ด ์์ด๊ฐ x์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ์์ด๊ฐ (C - x)๋งํผ ์ด๋ํ๋ฉด ์ค๋ฅธ์ชฝ ๋ฒฝ์ ๋ฐ๊ฒ๋๋ค. ๋จ์์๋ ์ด๋ํด์ผ ํ ๊ฑฐ๋ฆฌ๊ฐ (C - x) ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด ์ด ์์ด๋ฅผ C(์ค๋ฅธ์ชฝ ์ ค ๋)๋ก ์ด๋์ํค๊ณ ๋ฐฉํฅ์ ๋ฐ๊พผ๋ค. ์ด๋ ํ ๋จ์ ๊ฑฐ๋ฆฌ๋ ์๋ ๋จ์์๋ ์ด๋๊ฑฐ๋ฆฌ - (C - x)๊ฐ ๋๋ค.
๋ฐ๋๋ก ์์ด๊ฐ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ์๋ค๋ฉด, ํ์ฌ ์์ด์ ์์น๊ฐ x๋ฉด (x - 1)๋งํผ ์ด๋ํ๋ฉด ์ผ์ชฝ ๋ฒฝ์ ๋ฐ๊ฒ๋๋ค.
๋จ์ ์ด๋ํด์ผํ ๊ฑฐ๋ฆฌ๊ฐ (x - 1)๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด ์ด ์์ด๋ฅผ 1(์ผ์ชฝ ์ ค ๋)๋ก ์ด๋์ํค๊ณ ๋ฐฉํฅ์ ๋ฐ๊พผ๋ค.
๋ง์ฝ ์ด๋ํด์ผํ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ์ด๋ํด๋ ๋ฒฝ์ ๋ฐ์ง์์ผ๋ฉด ์์ด๋ฅผ ๋จ์ ๊ฑฐ๋ฆฌ๋งํผ ์ด๋์ํจ ํ, ๋ฐฉํฅ์ ์ ์งํ ์ฑ ์ด๋์ ์ข ๋ฃํ๋ค.
์์ด๊ฐ ์์๋๋ก ์์ง์ด๊ณ ์์ ๋๋ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ์ด๋ํ๋ฉด ๋๋ค. ์ด๋๋ x์ขํ๋ฅผ ๊ณ ์ ํ์ฑ y์ขํ๋ง ์ด๋์ํจ๋ค.
๋ชจ๋ ์์ด๋ฅผ ์ด๋์ํจ ํ์ ํ ์นธ์ ์ฌ๋ฌ๋ง๋ฆฌ์ ์์ด๊ฐ ์๋ค๋ฉด ์ด ์์ด๋ค์ ํฌ๊ธฐ ์์ผ๋ก ์ ๋ ฌํ ํ ์ ์ผ ํฐ ์์ด๋ง ๋จ๊ธฐ๊ณ ๋๋จธ์ง ์์ ์์ด๋ค์ ์ญ์ ํ๋ค.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 100 + 5;
vector<pair<int, pair<int, int>>> Shark[MAX_N][MAX_N];
int R, C, M;
int ans;
void Catch_Shark(int st) {
for (int i = 1; i <= R; i++) {
if (!Shark[i][st].empty()) {
ans += Shark[i][st][0].first;
Shark[i][st].clear();
return;
}
}
}
void change_direct(int &direction) {
if (direction == 1)
direction = 2;
else if (direction == 2)
direction = 1;
else if (direction == 3)
direction = 4;
else if (direction == 4)
direction = 3;
}
void Shark_Move() {
vector<pair<int, pair<int, int>>> temp[MAX_N][MAX_N];
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
if (Shark[i][j].empty())
continue;
int size = Shark[i][j][0].first;
int Pace = Shark[i][j][0].second.first;
int distance = Pace;
int direction = Shark[i][j][0].second.second;
if (direction == 1 || direction == 2) {
int now = i;
while (distance) {
if (direction == 1) { //์๋ก ๊ฐ๋์ค
if (distance >= (now - 1)) {
distance -= (now - 1);
now = 1;
change_direct(direction);
}
else {
now -= distance;
distance = 0;
}
continue;
}
else if (direction == 2) { // ๋ด๋ ค๊ฐ๋ ์ค
if (distance >= R - now) {
distance -= (R - now);
now = R;
change_direct(direction);
}
else {
now += distance;
distance = 0;
}
}
}
temp[now][j].push_back({ size,{Pace, direction} });
}
else if (direction == 3 || direction == 4) {
int now = j;
while (distance) {
if (direction == 3) { //์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ ์ค
if (distance >= (C - now)) {
distance -= (C - now);
now = C;
change_direct(direction);
}
else {
now += distance;
distance = 0;
}
}
else if (direction == 4) { //์ผ์ชฝ์ผ๋ก ๊ฐ๋ ์ค
if (distance >= (now - 1)) {
distance -= (now - 1);
now = 1;
change_direct(direction);
}
else {
now -= distance;
distance = 0;
}
}
}
temp[i][now].push_back({ size ,{Pace, direction} });
}
}
}
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
Shark[i][j].clear();
if (temp[i][j].empty()) {
continue;
}
else if (temp[i][j].size() == 1) {
Shark[i][j] = temp[i][j];
}
else {
sort(temp[i][j].begin(), temp[i][j].end(), greater<pair<int,pair<int,int>>>());
pair<int, pair<int, int>> copy = temp[i][j][0];
Shark[i][j].push_back(copy);
}
}
}
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> R >> C >> M;
for (int i = 0; i < M; i++) {
int r, c, s, d, z;
cin >> r >> c >> s >> d >> z;
Shark[r][c].push_back({ z,{s,d} });
}
int Fishing_King_col = 0;
while (Fishing_King_col <= C) {
Fishing_King_col++;
Catch_Shark(Fishing_King_col);
Shark_Move();
}
cout << ans << "\n";
return 0;
}
|
cs |
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 17142 : ์ฐ๊ตฌ์ 3 (0) | 2022.05.17 |
---|---|
[BOJ] 11758 : CCW (0) | 2022.05.12 |
[BOJ] 17144 : ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2022.05.11 |
[BOJ] 16235 : ๋๋ฌด ์ฌํ ํฌ (0) | 2022.05.11 |
[BOJ] 16234 : ์ธ๊ตฌ ์ด๋ (0) | 2022.05.10 |