본문 바로가기
알고리즘/투포인터

1806 부분합 (더블릿 부분합)

by tryotto 2019. 2. 12.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
int arr[100001= { 0 };
 
int main() {
    int n, s;
    scanf("%d %d"&n, &s);
 
    for (int i = 1; i <= n; i++) {
        scanf("%d"&arr[i]);
        arr[i] += arr[i - 1];
    }
 
    int left = 1, right = 1;
    long long sum = arr[1];
    int min = 1000000000;
    while (left <= right&&right<=n) {
        if (sum < s) {
            right++;
        }
        else {
            if (right+1 - left < min)
                min = right+1 - left;
 
            if (sum == s)
                right++;
            else
                left++;
 
            if (left > right&&left<=n) {
                right = left;
                sum = arr[left]-arr[left-1];
            }
        }
        sum = arr[right] - arr[left-1];
    }
    if (min == 1000000000)
        printf("0");
    else
        printf("%d", min);
}
cs


'알고리즘 > 투포인터' 카테고리의 다른 글

연속적인 소수의 합 더블릿 (1644 백준)  (0) 2019.02.13
2003 수들의 합(2)  (0) 2019.02.12