728x90
반응형
https://www.acmicpc.net/problem/3151
문제
Elly는 예상치 못하게 프로그래밍 대회를 준비하는 학생들을 가르칠 위기에 처했다. 대회는 정확히 3명으로 구성된 팀만 참가가 가능하다. 그러나 그녀가 가르칠 학생들에게는 큰 문제가 있었다. 코딩 실력이 좋으면 팀워크가 떨어지고, 팀워크가 좋을수록 코딩 실력이 떨어진다. 그리고 출전하고자 하는 대회는 코딩 실력과 팀워크 모두가 중요하다.
Elly는 그녀가 가르칠 수 있는 모든 학생들의 코딩 실력을 알고 있다. 각각의 코딩 실력 Ai는 -10000부터 10000 사이의 정수로 표시되어 있다. 그녀는 팀워크와 코딩 실력이 모두 적절한 팀을 만들기 위해, 세 팀원의 코딩 실력의 합이 0이 되는 팀을 만들고자 한다. 이러한 조건 하에, 그녀가 대회에 출전할 수 있는 팀을 얼마나 많이 만들 수 있는지를 계산하여라.
N명의 학생들의 코딩 실력 Ai가 -10000부터 10000사이의 정수로 주어질 때, 합이 0이 되는 3인조를 만들 수 있는 경우의 수를 구하여라.
입력
입력은 표준 입력으로 주어진다.
첫 번째 줄에 학생의 수 N이 입력된다. 두 번째 줄에 N개의 그녀가 가르칠 학생들의 코딩 실력인 Ai가 주어진다.
출력
표준 출력으로 그녀가 고를 수 있는 팀의 수를 하나의 정수로 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<cmath>
#include<iostream>
#include <tuple>
#include<algorithm>
#include<vector>
#include<deque>
#include<queue>
#define MAX_SIZE 1003
#define INF 987654321
using namespace std;
typedef long long ll;
ll N, answer = 0;
vector<int> v;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
int x; cin >> x;
v.push_back(x);
}
sort(v.begin(), v.end());
for (int i = 0; i < N - 2; i++) {
for (int j = i + 1; j < N - 1; j++) {
int Value = (-1) * (v[i] + v[j]);
int from = lower_bound(v.begin()+j+1, v.end(), Value) - v.begin();
int to = upper_bound(v.begin() + j + 1, v.end(), Value) - v.begin();
//cout << "Value : " << Value << " , from : " << from << " to : " << to << endl;
answer += to-from;
}
}
cout << answer << endl;
return 0;
}
728x90
반응형
'BOJ > 이분 탐색' 카테고리의 다른 글
[C/C++] 백준 - 2143번 : 두 배열의 합 (0) | 2021.08.22 |
---|---|
[C/C++] 백준 - 2473번 : 세 용액 (0) | 2021.08.18 |
[C/C++] 백준 - 14921번 : 용액 합성하기 (0) | 2021.08.17 |
[C/C++] 백준 - 2467번 : 용액 (0) | 2021.08.17 |
[C/C++] 백준 - 2295번 : 세 수의 합 (0) | 2021.08.17 |