슈뢰딩거의 고등어
15656 치킨배달 본문
https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
골드 5
#include <stdio.h>
#include <vector>
#include <algorithm>
#define INF 0x7fffffff
using namespace std;
struct POSI {
int y, x;
};
int n, m, type, answer;
vector <POSI> house, shop, pick;
// 조합
void DFS(int pos) {
if(pick.size() == m) {
int ret = 0;
for(const auto h: house) {
int min_dis = INF;
for(const auto p: pick){
min_dis = min(min_dis,
abs(h.y - p.y) + abs(h.x - p.x));
}
ret += min_dis;
}
if (answer > ret)
answer = ret;
return;
}
for(int i=pos; i<shop.size(); i++) {
pick.push_back(shop[i]);
DFS(i+1);
pick.pop_back();
}
}
int main() {
scanf("%d %d", &n, &m);
POSI target;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
scanf("%d", &type);
target.y = i;
target.x = j;
if(type == 1) {
house.push_back(target);
}
else if(type == 2) {
shop.push_back(target);
}
}
answer = INF;
DFS(0);
printf("%d\n", answer);
return 0;
}
모든 치킨가게 목록에서 M 개를 뽑아 모든 부분집합을 구한 후, 각 경우의 도시의 치킨거리를 구한다.
최소의 값을 answer 에 저장하여 리턴한다.
처음 접근은 일반적인 방식으로 하나의 이차원 map 에 house, shop, blank를 모두 저장하려 했으나
각각의 경우를 나누어 계산을 해야 조합을 구하기가 시간복잡도가 낮았음.
시간초과가 계속해서 나서 size()를 많이 사용해서 그런것인지. abs() 가 느린함수여서 그런것인지 등의 원인을 생각하여
다양한 방법을 시도해보았으나, 결국 DFS(pos+1) -> DFS(i+1)로 호출하지 않아 발생한 이슈였다.
어떻게 테스트 케이스를 통과했는지 의문.. 아무튼 성공은 했다...ㅎㅎ
'알고리즘' 카테고리의 다른 글
level 2 소수찾기 -순열 (algorithm :: next_permutaion) (0) | 2021.12.06 |
---|---|
19236 청소년상어 (cstring :: memcpy) (0) | 2021.12.06 |
16236 아기상어 (0) | 2021.12.05 |
14890 경사로 (0) | 2021.12.04 |
14501 퇴사 (0) | 2021.12.02 |
Comments