PS/Baekjoon Online Judge

[백준 2143] 두 배열의 합 [C]

kimyoungrok 2021. 9. 2. 11:47

백준 - 2143


풀이

A와 B의 부 배열에 대한 누적 합을 계산 후 정렬해주고,  upper/lower bound로 가능한 경우를 계산해주면 된다.

단, 가능한 경우가 없을 수 있으니 left <= right까지 탐색을 해주어 계산을 하면된다.


소스코드

#include <stdio.h>
#include <stdlib.h>
#define MAX 500500
int a[MAX], b[MAX];
int compare(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}
int main(){
    int T, n, m, A[1000], B[1000];
    scanf("%d %d", &T, &n);
    for (int i = 0; i < n; i++) scanf("%d", &A[i]);
    scanf("%d", &m);
    for (int i = 0; i < m; i++) scanf("%d", &B[i]);
	
    int a_len = 0, b_len = 0;
    for (int i = 0, sum = 0; i < n; i++){
        a[a_len++] = (sum = A[i]);
        for (int j = i+1; j < n; j++)
            a[a_len++] = (sum += A[j]);
    }
    qsort(a, a_len, sizeof(int), compare);
	
    for (int i = 0, sum = 0; i < m; i++){
        b[b_len++] = (sum = B[i]);
        for (int j = i+1; j < m; j++)
            b[b_len++] = (sum += B[j]);
    }
    qsort(b, b_len, sizeof(int), compare);
	
    long long cnt = 0;
    for (int i = 0; i < a_len; i++){
        int left = 0, right = b_len-1, mid;
        int diff = T - a[i];
		
        while (left <= right){
            mid = (left+right) / 2;
            if (b[mid] > diff) right = mid - 1;
            else left = mid + 1;
        }
        cnt += right;
		
        left = 0;
        do{
            if (b[mid] >= diff) right = mid - 1;
            else left = mid + 1;
            mid = (left+right) / 2;
        }while (left <= right);
        cnt -= right;
    }
    printf("%lld", cnt);
}

출처

 

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

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 14939] 불 끄기 [C]  (0) 2021.09.02
[백준 7579] 앱 [C]  (0) 2021.09.02
[백준 5347] LCM [C]  (0) 2021.09.02
[백준 15897] 잘못 구현한 에라토스테네스의 체 [C]  (0) 2021.09.02
[백준 1188] 음식 평론가 [C]  (0) 2021.09.02