https://www.acmicpc.net/problem/15661
15661번: 링크와 스타트
첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100
www.acmicpc.net
1. Logic
팀을 꾸릴때 인원이 최대 20명이고 1명부터 팀을 꾸릴 수 있기 때문에 시간복잡도가 19!이 나온다. 이렇게 되면 시간복잡도를 한참 뛰어넘기 때문에 로직을 생각해 봐야 한다.
우리는 두 팀의 능력치의 절댓값을 판단해야 하기 때문에 1, 2, 3, 4의 인원으로 팀을 꾸리면 1,2 를 골라서 팀을 꾸리는 것과 3, 4를 골라서 팀을 꾸려서 능력치를 비교하면 결과값을 똑같이 나오기 때문에 최대 n/2까지 돌아서 계산하면 10!=3628800이 나오기 때문에 2초안에 충분히 돌 수 있다.
2. Code
#include <bits/stdc++.h>
using namespace std;
int n;
int ans = 0x3f3f3f3f;
int input[21][21];
bool check[21];
int rateCalc() {
int startRate = 0;
int linkRate = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(check[i] && check[j]) {
startRate += input[i][j];
}
else if(!check[i] && !check[j]) {
linkRate += input[i][j];
}
}
}
return abs(startRate-linkRate);
}
void solve(int cnt, int idx) {
if(cnt > n/2) return;
if(cnt > 0) {
ans = min(ans, rateCalc());
}
for(int i = idx; i < n; i++) {
check[i] = true;
solve(cnt+1, i+1);
check[i] = false;
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin >> input[i][j];
}
}
solve(0, 0);
cout << ans;
}
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
'Algorithm > Beakjoon' 카테고리의 다른 글
[OS/운영체제] Banker's Algorithm / 은행원 알고리즘 (2) | 2024.01.26 |
---|---|
[백준/Baekjoon] 6593 상범 빌딩 C++ :: BFS (1) | 2024.01.26 |
[백준/Baekjoon] 2442 별 찍기-5 C++ :: Implementation (0) | 2024.01.24 |
[백준/Baekjoon] 1503 세 수 고르기 C++ :: Brute force (0) | 2024.01.20 |
[백준/Baekjoon] 5014 스타트링크 C++ :: BFS (0) | 2024.01.18 |
https://www.acmicpc.net/problem/15661
15661번: 링크와 스타트
첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100
www.acmicpc.net
1. Logic
팀을 꾸릴때 인원이 최대 20명이고 1명부터 팀을 꾸릴 수 있기 때문에 시간복잡도가 19!이 나온다. 이렇게 되면 시간복잡도를 한참 뛰어넘기 때문에 로직을 생각해 봐야 한다.
우리는 두 팀의 능력치의 절댓값을 판단해야 하기 때문에 1, 2, 3, 4의 인원으로 팀을 꾸리면 1,2 를 골라서 팀을 꾸리는 것과 3, 4를 골라서 팀을 꾸려서 능력치를 비교하면 결과값을 똑같이 나오기 때문에 최대 n/2까지 돌아서 계산하면 10!=3628800이 나오기 때문에 2초안에 충분히 돌 수 있다.
2. Code
#include <bits/stdc++.h> using namespace std; int n; int ans = 0x3f3f3f3f; int input[21][21]; bool check[21]; int rateCalc() { int startRate = 0; int linkRate = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(check[i] && check[j]) { startRate += input[i][j]; } else if(!check[i] && !check[j]) { linkRate += input[i][j]; } } } return abs(startRate-linkRate); } void solve(int cnt, int idx) { if(cnt > n/2) return; if(cnt > 0) { ans = min(ans, rateCalc()); } for(int i = idx; i < n; i++) { check[i] = true; solve(cnt+1, i+1); check[i] = false; } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cin >> input[i][j]; } } solve(0, 0); cout << ans; }
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
'Algorithm > Beakjoon' 카테고리의 다른 글
[OS/운영체제] Banker's Algorithm / 은행원 알고리즘 (2) | 2024.01.26 |
---|---|
[백준/Baekjoon] 6593 상범 빌딩 C++ :: BFS (1) | 2024.01.26 |
[백준/Baekjoon] 2442 별 찍기-5 C++ :: Implementation (0) | 2024.01.24 |
[백준/Baekjoon] 1503 세 수 고르기 C++ :: Brute force (0) | 2024.01.20 |
[백준/Baekjoon] 5014 스타트링크 C++ :: BFS (0) | 2024.01.18 |