백준2496 금강석

문제 링크

  • http://icpc.me/2496

문제 출처

  • 2009 KOI 지역본선 중등부 2번

풀이

일단 맵을 45도 회전시켜 직사각형의 각 변이 축에 평행하도록 만들어줍시다.
(x, y) -> (x+y, x-y)

고기잡이문제처럼 직사각형의 왼쪽 변과 윗 변에 각각 금강석이 걸치도록 하는 방법 중 하나가 무조건 정답이 됩니다.
O(T2)가지의 경우를 탐색해보면 정답을 구할 수 있습니다.

전체 코드

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
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;

typedef long long ll;
typedef pair<ll, ll> p;

int n, m, t, k; //map sz, ~, stone, sz

vector<p> v;

int f(int x, int y){
	int ret = 0;
	for(auto i : v){
		if(x <= i.x && i.x <= x+k && y <= i.y && i.y <= y+k) ret++;
	}
	return ret;
}

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m >> t >> k;
	for(int i=1; i<=t; i++){
		int a, b; cin >> a >> b; v.emplace_back(a+b, a-b);
	}

	int mx = 0;
	p ans;
	for(int i=0; i<t; i++){
		for(int j=0; j<t; j++){
			int now = f(v[i].x, v[j].y);
			if(mx < now){
				mx = now;
				ans = {v[i].x+k/2, v[j].y+k/2};
			}
		}
	}

	int x = (ans.x + ans.y) / 2;
	int y = ans.x - x;

	cout << x << " " << y << "\n";
	cout << mx << "\n";
}