728x90
반응형
2143번: 두 배열의 합
문제
https://www.acmicpc.net/problem/2143
2143번: 두 배열의 합
첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그
www.acmicpc.net
풀이
n과 m이 최대 1000이므로 가능한 모든 부분합을 구한 다음 가능한 조합의 수를 구하면 된다. 즉, A 부분합 배열의 각 원소에 대해 T가 되기 위해 필요한 수가 B 부분합 배열에 몇 개가 있는지 확인한다. B 부분합 배열을 오름차순 정렬한 후 lower_bound, upper_bound를 사용해 iterator의 차이(개수)를 정답에 추가한다. 경우의 수는 int 범위를 벗어날 수 있으므로 long long으로 해야 한다.
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T, n, m;
int A[1001], B[1001];
cin >> T >> n;
for (int i = 0; i < n; i++)
cin >> A[i];
cin >> m;
for (int i = 0; i < m; i++)
cin >> B[i];
vector<int> aSum, bSum;
for (int i = 0; i < n; i++) {
int sum = A[i];
aSum.push_back(sum);
for (int j = i + 1; j < n; j++) {
sum += A[j];
aSum.push_back(sum);
}
}
for (int i = 0; i < m; i++) {
int sum = B[i];
bSum.push_back(sum);
for (int j = i + 1; j < m; j++) {
sum += B[j];
bSum.push_back(sum);
}
}
sort(bSum.begin(), bSum.end());
long long ans = 0;
for (int i = 0; i < aSum.size(); i++) {
int tmp = T - aSum[i];
int u = upper_bound(bSum.begin(), bSum.end(), tmp) - bSum.begin();
int l = lower_bound(bSum.begin(), bSum.end(), tmp) - bSum.begin();
ans += u - l;
}
cout << ans;
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 1717 집합의 표현 (2) | 2023.03.28 |
---|---|
[백준 / BOJ] C++ 2638 치즈 (0) | 2023.03.28 |
[백준 / BOJ] C++ 27920 카드 뒤집기 (6) | 2023.03.27 |
[백준 / BOJ] C++ 27919 UDPC 파티 (0) | 2023.03.27 |
[백준 / BOJ] C++ 27918 탁구 경기 (2) | 2023.03.27 |