문제
백준 15686
방법 1 (틀림)
설명
각 치킨 집마다 모든 가정집으로부터의 거리를 누적해서 더해줌.
- 그리고 정렬해서 가장 낮은 m 개를 선택해줌.
근데 반례가 생김
- 모든 가정집 옆집에 치킨집을 줌.
- 그리고 아무데나 치킨집을 하나 더 넣어줌.
m
이 가정집 갯수 - 1
인 경우 무조건 추가로 넣은 치킨집을 빼야함.
- 하지만 이 알고리즘은 그것을 보장하지 않음.
- 실제 반례
방법 2
설명
직접 재귀로 조합을 구현함
이 방법 말고 BitMask 방법이랑 std::next_permutation
을 써봤는데 재귀가 젤 빨랐음.
- bitMask 의 경우 \({}_{N}C_{M}\) 에서 \(M\) 이 \(0\) 부터 \(N\) 까지의 값을 모두 더한 경우를 다 쓰니까 느린게 당연하긴 함.
std::next_permutation
의 경우는 이걸 참고해서 해봤는데 bitMask 랑 비슷하게 나옴.
시간복잡도
O(\({}_{N}C_{M}\))
코드
댓글남기기