※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 7573번 문제인 고기잡이이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/7573
7573번: 고기잡이
한국인의 식단에서 생선은 매우 중요한 단백질 공급원이다. 반면, 지구 온난화로 인한 바닷물의 온도 상승, 그리고 지금까지 마구잡이로 물고기를 잡은 결과로 점점 우리나라의 바다에서 물고
www.acmicpc.net
어떤 그물을 쳐서 그 그물에 걸리는 물고기의 수가 최대일 때, 항상 이 그물을 평행이동시켜 원래 잡을 수 있던 모든 물고기가 들어있으면서 (문제에 주어진 그림 기준으로) 왼쪽변에서 잡히는 물고기가 있게끔 옮길 수 있다.
따라서, 모든 물고기(M마리)에 대하여, 이 물고기를 왼쪽변 위에 있게 하면서 그물을 펼치는 모든 경우의 수(O(l^2))만큼 그물을 펼쳐 그 안에 몇 마리의 물고기가 들어있는지 각 M마리의 물고기에 대해 확인하는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int ans = 0;
int N, l, M;
pair<int, int> fish[100];
vector<pair<int, int>> group;
void solve(int idx) {
auto& p = fish[idx];
group.clear();
for (int i = 0; i < M; i++) {
if (abs(fish[i].first - p.first) + abs(fish[i].second - p.second) <= l) group.emplace_back(fish[i]);
}
for (int x = 1; x < l; x++) { // x by y 박스
int y = l - x;
for (int dx = 0; dx <= x; dx++) {
int tmp = 0;
int xL = p.first - dx, xR = p.first + (x - dx);
int yL = p.second, yR = p.second + y;
for (auto pp : group) {
if (xL <= pp.first && pp.first <= xR && yL <= pp.second && pp.second <= yR) tmp++;
}
ans = max(ans, tmp);
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> l >> M; l >>= 1;
for (int i = 0; i < M; i++) {
cin >> fish[i].first >> fish[i].second;
}
for (int i = 0; i < M; i++) {
solve(i);
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 3067 // C++] Coins (0) | 2022.05.29 |
---|---|
[BOJ 5934 // C++] Visiting Cows (0) | 2022.05.29 |
[BOJ 2078 // C++] 무한이진트리 (0) | 2022.05.27 |
[BOJ 1835 // C++] 카드 (0) | 2022.05.26 |
[BOJ 1623 // C++] 신년 파티 (0) | 2022.05.25 |