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
- Flutter
- Crossfit
- 브루트포스
- 4811
- 그리디
- 재귀
- 26008
- sw expert academy
- 백준
- 1로만들기2
- D1
- 1781
- 크로스핏
- 회전하는큐
- 재귀함수
- 스택
- BOJ
- 동적프로그래밍
- 15353
- 삼성
- spring boot
- 15662
- dart
- 14863
- 서울에서경산까지
- DP
- C++
- BOJ14889
- 해시해킹
- Python
Archives
- Today
- Total
곧죽어도 콛잉
[구현 / BOJ 14889 / C++] 스타트와 링크 본문
https://www.acmicpc.net/problem/14889
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
1) nCn/2 를 구한다.
2) 두 팀을 나눈 경우의 수 각각에 대하여 능력치 합을 구한 다음, 그 차이를 구한다.
3) 그 차이가 가장 적은 경우가 답이 된다.
코드가 좀 더럽다...
이 문제의 핵심은 nCn/2 라는 점이다. 나는 이걸 그냥 combination으로 해결하려고 했다.
combi 함수를 선언하고 vector<int> now에는 그 조합이 나온다. 그리고나서 그 조합에 해당하는 n*n번의 과정으로 해당 팀원들의 한 쌍의 합을 구했다.
여기서 문제는 다른 팀원들이다!!.. 그래서 난 어쩔 수 없이 vector<int> now를 완성하는 동안 bool 배열을 선언하여 어느팀원이 빠졌고, 들어갔는지 계속 체크해갔다. 그리고나서 그 빠진인원을 다 센 후 그 인원들로 이뤄진 팀의 능력치 합을 구했다.
그러다 보니 굉장히 중구난방으로 풀어버렸다. 코딩테스트 공부를 오랜만에 하니깐 진짜 머리가 백지 상태다 ㅠㅠ 어디서부터 복습해야할지 감도 안온다 ... ㅠㅠ
다시 화이팅하자!!
#include <bits/stdc++.h>
using namespace std;
int arr[20][20], N, res=INT_MAX;
bool bd[20];
vector<pair<int, int>> pv;
void combi(int st, vector<int> now){
if(now.size()==N/2){
int team1=0;
int team2=0;
vector<int> notnow;
for(int i = 0 ; i < N; i++){
if(!bd[i]) notnow.push_back(i);
}
for(int i = 0 ; i < notnow.size(); i++){
for(int j = 0 ; j < notnow.size(); j++){
team2+=arr[notnow[i]][notnow[j]];
}
}
for(int i = 0 ; i < now.size(); i++){
for(int j = 0 ; j < now.size(); j++){
team1+=arr[now[i]][now[j]];
}
}
res = min(res, abs(team1-team2));
return;
}
for(int i = st+1 ; i < N ; i++){
now.push_back(i);
bd[i]=1;
combi(i, now);
now.pop_back();
bd[i]=0;
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N;
for(int i = 0 ; i < N ; i++){
for(int j = 0 ; j < N ; j++){
cin >> arr[i][j];
}
}
vector<int> v;
combi(-1, v);
cout << res;
}
'Coding Test > C++' 카테고리의 다른 글
[구현 / BOJ 15662 / C++] 톱니바퀴 (2) (0) | 2023.06.29 |
---|---|
[구현 / BOJ 14888 / C++] 연산자 끼워넣기 (0) | 2023.06.28 |
[그리디 / BOJ 1781 / C++] 컵라면 (0) | 2023.05.18 |
[스택 / BOJ 9935 / C++] 문자열 폭발 (0) | 2023.05.17 |
[그리디 / BOJ 2109 / C++] 순회강연 (2) | 2023.05.15 |
Comments