-
백준 - 스타트와 링크 (14889) [C++]문제 풀이/백준 2024. 4. 2. 22:47반응형
이 문제 또한 백트래킹으로 풀었다.
연산 수는 최대 20C10 * 10 * 10 이므로 충분히 1초 안에 풀 수 있다.
로직은 절반을 선택하고, 스타트 팀과 링크 팀의 능력치를 구해 차이를 리턴해주면 된다.
#include <iostream> #include <algorithm> #include <vector> using namespace std; #define MAX 20 #define INF 1000000000 int N; int S[MAX][MAX]; void input() { cin >> N; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> S[i][j]; } } } vector<int> makeLink(vector<int> &start) { vector<bool> visited(N, false); for (int s : start) { visited[s] = true; } vector<int> link; for (int i = 0; i < N; i++) { if (!visited[i]) { link.push_back(i); } } return link; } int calculate(vector<int> &some) { int result = 0; for (int i : some) { for (int j : some) { result += S[i][j]; } } return result; } int absolute(int a) { if (a < 0) { return -a; } return a; } int pickHalf(vector<int> &start, int prev) { if (start.size() == N / 2) { // some action vector<int> link = makeLink(start); int startRes = calculate(start); int linkRes = calculate(link); int result = absolute(startRes - linkRes); return result; } int result = INF; for (int i = prev + 1; i < N; i++) { start.push_back(i); result = min(result, pickHalf(start, i)); start.pop_back(); } return result; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); input(); vector<int> start; cout << pickHalf(start, -1) << '\n'; return 0; }
반응형'문제 풀이 > 백준' 카테고리의 다른 글
백준 - 큐빙 (5373) [C++] (0) 2024.04.06 백준 - 어항 정리 (23291) [C++] (0) 2024.04.06 백준 - 연산자 끼워넣기 (14888) [C++] (0) 2024.04.02 백준 - 퇴사 (14501) [C++] (0) 2024.04.02 백준 - 시험 감독 (13458) [C++] (0) 2024.04.02