-
BOJ 3151: 합이 0알고리즘 2023. 6. 26. 16:35
#BOJ 3151: 합이 0
3151번: 합이 0
Elly는 예상치 못하게 프로그래밍 대회를 준비하는 학생들을 가르칠 위기에 처했다. 대회는 정확히 3명으로 구성된 팀만 참가가 가능하다. 그러나 그녀가 가르칠 학생들에게는 큰 문제가 있었다.
www.acmicpc.net
#풀이
간단하게 3개의 숫자를 더해서 0이 되는 숫자를 찾는 문제이다.
이분탐색에서 중복된 수의 개수를 구하는 방법은 upper_bound() - lower_bound() 를 하면 숫자가 몇개 중복되어 있는 확인할 수 있다.
사실 그냥 간단하게 2개의 숫자를 고르고 남은 숫자를 찾으면 해결할 수 있는 문제이다.
맨 처음에는 next_permutation으로 해결하려고 했다가 중복되어 숫자를 고르는게 너무 많아 결과값이 너무 많게 나왔다....
#코드
#include<iostream> #include<vector> #include<algorithm> using namespace std; int n; vector<int> arr; vector<int> arr1; int arr_[10002]; long long ans; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 0; i < n; i++) { int num; cin >> num; arr.push_back(num); } sort(arr.begin(), arr.end()); for (int i = 0; i < n-1; i++) { for (int j = i + 1; j < n; j++) { ans = ans + (upper_bound(arr.begin()+j+1, arr.end(), -1 * (arr[i] + arr[j])) - lower_bound(arr.begin()+j+1, arr.end(), -1 * (arr[i] + arr[j]))); } } cout << ans << '\n'; return 0; }
'알고리즘' 카테고리의 다른 글
BOJ 2110: 공유기 설치 (0) 2023.06.27 BOJ 2473: 세 용액 (0) 2023.06.27 BOJ 2467:용액 (0) 2023.06.26 BOJ 18869: 멀티버스 Ⅱ (0) 2023.06.26 BOJ 2805: 나무 자르기 (0) 2023.06.25