SDJ( 수돈재 아님 ㅎ )

[C++] 1806 - 부분합 본문

알고리즘/Backjoon

[C++] 1806 - 부분합

ShinDongJun 2020. 2. 1. 08:34

문제 링크 : https://www.acmicpc.net/problem/1806

 

1806번: 부분합

문제 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. 출력 첫째 줄에 구하고자 하는 최소의 길

www.acmicpc.net

 

 

 

 

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
#include<bits/stdc++.h>
 
#define endl '\n'
 
using namespace std;
 
int N, K;
 
int A[100005];
 
int main(void)
{
    unsigned long long sum = 0;
    scanf("%d %d"&N, &K);
    for(int i = 0; i < N; ++i)
        scanf("%d", A+i);
 
    int start, end;
    int ans = 987654321;
    start = end = 0;
 
    for(int i = 0; i < N; ++i)
    {
        while(sum < K && end < N)
            sum += A[end++];
 
        if(K <= sum && end - start < ans)
            ans = end - start;
 
        sum -= A[start++];
    }
    if(ans == 987654321)
        printf("%d\n"0);
    else
        printf("%d\n", ans);
 
    return 0;
}

'알고리즘 > Backjoon' 카테고리의 다른 글

[C] 1021 - 회전하는 큐  (0) 2020.06.30
[C++] 12904 - A와 B  (0) 2020.06.30
[C++] 2589 - 보물섬  (0) 2020.02.01
[C++] 1963 - 소수 경로  (0) 2020.02.01
[C++] 11881 - 지우개  (0) 2020.02.01
Comments