#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<long long> vec;
void dfs(int start, int end, vector<long long>& part, long long sum)
{
if (start > end)
{
part.push_back(sum);
return;
}
else
{
dfs(start + 1, end, part, sum);
dfs(start + 1, end, part, sum + vec[start]);
}
}
int main()
{
int N, C;
cin >> N >> C;
vec = vector<long long>(N, 0);
for (int i = 0; i < N; ++i)
{
cin >> vec[i];
}
vector<long long> left;
vector<long long> right;
dfs(0, N / 2 - 1, left, 0);
dfs(N / 2, N - 1, right, 0);
sort(right.begin(), right.end());
int count = 0;
for (int i = 0; i < left.size(); ++i)
{
count += upper_bound(right.begin(), right.end(), C - left[i]) - right.begin();
}
cout << count;
return 0;
}
이게 왜 투포인터인가... 싶은 느낌의 문제였는데
모든 수를 넣었다 뺏다 하려니까 2의 30승으로 시간이 모자르더라구요.
최대를 반으로 나눠서 시간을 나눴습니다. 최대를 2의 15승 두번으로 나눴습니다.
이후 갯수를 세주는 upper_bound로 왼쪽과 오른쪽의 합이 C를 넘지 않는 경우를 구해서 count에 더해줍니다.
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 4195 친구 네트워크 (0) | 2023.05.15 |
---|---|
[C++] 백준 11780 플로이드 2 (0) | 2023.05.12 |
[C++] 백준 9370 미확인도착지 (0) | 2023.05.03 |
[C++] 백준 1956 운동 (0) | 2023.05.02 |
[C++] 백준 11657 타임머신 (0) | 2023.05.01 |