PS

백준 16937번 두 스티커

남마허 2020. 3. 15. 23:45

https://www.acmicpc.net/problem/16937

 

16937번: 두 스티커

첫째 줄에 모눈종이의 크기 H, W, 둘째 줄에 스티커의 수 N이 주어진다. 다음 N개의 줄에는 스티커의 크기 Ri, Ci가 주어진다.

www.acmicpc.net

 

 

 

 

 

 

<접근방법>

모눈종이의 범위안에서 좌표마다 고려해주는 완전탐색으로 하면 시간초과가 납니다.

 

스티커는 2개만 붙입니다.

그러므로 스티커를 붙이는 형태를 강제할 수 있습니다.

1, 2 가 각각의 스티커라고 가정했을 때,

 

1 2 

혹은

1

2

 

이렇게 말이죠.

 

단, 스티커가 회전하는 것도 고려해야 합니다.

 

<느낀 점>

 

 

 


 

 

 

<코드>

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct point {
	int y, x;
};

int n, m, k, res;
vector<point> s;
vector<point> v;

void simul() {
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 2; j++) {
			point a = v[0], b = v[1];

			if (i == 1) swap(a.y, a.x);
			if (j == 1) swap(b.y, b.x);

			int y, x;

			//1번
			y = max(a.y, b.y);
			x = a.x + b.x;

			if (y <= n && x <= m) {
				res = max(a.y*a.x + b.y*b.x, res);
			}

			//2번
			y = a.y + b.y;
			x = max(a.x, b.x);

			if (y <= n && x <= m) {
				res = max(a.y*a.x + b.y*b.x, res);
			}
		}
	}
}

void select(int dep, int start) {
	if (dep == 2) {
		simul();
		return;
	}

	for (int i = start; i < k; i++) {
		v.push_back(s[i]);
		select(dep + 1, i +1);
		v.pop_back();
	}
}


int main() {
	cin >> n >> m;
	cin >> k;
	for (int i = 0, a, b; i < k; i++) {
		cin >> a >> b;
		s.push_back({ a, b });
	}
	
	select(0, 0);

	cout << res << '\n';

	return 0;
}

 

 

 

 

 

 

반응형