Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Linux
- UActor
- hackerank
- oracle
- 셰그먼트트리
- 오손데이터읽기
- 백준
- 트랜잭션 관리
- 5639
- UnrealMP
- Unreal
- SQL
- 의미와 무의미의 경계에서
- 실습
- FBX
- 백준 1253번
- 언리얼 커스텀 플러그인
- 1253번
- 언리얼 플러그인
- 데이터베이스 배움터
- 1967번
- 민겸수
- Security
- C++
- OS
- objtofbx
- 1759번
- 비재귀셰그먼트
- 2단계로킹
- command not found
Archives
- Today
- Total
fatalite
치킨 배달 / 15686번 백준 본문
문제 분석
난이도 : 골드 5
문제 : 백 트래킹, 브루트 포스, 구현, 시뮬레이션
깨달은 점
1. unordered_set이나, set 쓰지 말고 그냥 Selected[13]으로 해야 erase 하는데에 O(1)이 된다.
2. 인자 값으로 선택된 것의 인덱스를 넘겨줘서 그 이후만 하도록 해서 시간 복잡도를 줄인다.
문제 코드
#include <iostream>
#include <vector>
#include <utility>
#include <cmath>
#include <queue>
#include <algorithm>
#include <deque>
#include <set>
#include <map>
#include <unordered_map>
#include <string>
#include <unordered_set>
#include <climits>
using namespace std;
int n, m;
long long int MinimumCityChickenDistance = INT_MAX;
vector<vector<int>> City;
vector<int> HomePos;
vector<int> ChickenStorePos;
vector<int> ChickenList;
bool Selected[13];
//Initialize STD IN & OUTPUT
void Init()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
void CheckChickenDistance()
{
long long int CityMinDist = 0;
for (int Home : HomePos)
{
long long int ChickenMinDist = INT_MAX;
for (int Store : ChickenList)
{
long long int CurDist =
abs(Store / 50 - Home / 50) + abs(Store % 50 - Home % 50);
ChickenMinDist = min(ChickenMinDist, CurDist);
}
CityMinDist += ChickenMinDist;
}
MinimumCityChickenDistance = min(MinimumCityChickenDistance, CityMinDist);
}
void Simulate(int x, int SelectedCount)
{
if (SelectedCount == m)
{
CheckChickenDistance();
}
else
{
for (int i = x; i < ChickenStorePos.size(); ++i)
{
if (Selected[i] == true) continue;
ChickenList.push_back(ChickenStorePos[i]);
Selected[i] = true;
Simulate(i, SelectedCount + 1);
Selected[i] = false;
ChickenList.pop_back();
}
}
}
int main()
{
Init();
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
vector<int> Line;
for (int j = 0; j < n; ++j)
{
int Tmp;
cin >> Tmp;
Line.push_back(Tmp);
if (Tmp == 2)
{
ChickenStorePos.push_back(i * 50 + j);
}
else if (Tmp == 1)
{
HomePos.push_back(i * 50 + j);
}
}
City.push_back(Line);
}
Simulate(0, 0);
cout << MinimumCityChickenDistance;
}
'코딩 인터뷰 > C++' 카테고리의 다른 글
연속합 / 1912번 백준 (0) | 2023.09.09 |
---|---|
암호 만들기 / 1759번 백준 (0) | 2023.09.04 |
N-Queens / 9663번 백준 🌋🌋🌋🌋 (0) | 2023.08.31 |
CCW - 백준 11758번 (0) | 2023.07.29 |
이분 그래프 - 백준 1707 (0) | 2023.05.22 |