https://www.acmicpc.net/problem/1806
문제
10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
출력
첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
예제 입력 1
10 15
5 1 3 5 10 7 4 9 2 8
예제 출력 1
2
#include <iostream>
#include <algorithm>
using namespace std;
int N, S;
int num[100000];
int a, b;
int main() {
freopen("input.txt", "r", stdin);
cin >> N >> S;
for (int i = 0; i < N; i++)
{
cin >> num[i];
}
int sum = num[0];
int result = 100000;
while (b<N) {
if (sum >= S) {
result = min(result, abs(a - b)+1);
sum -= num[a];
a++;
}
else {
b++;
sum += num[b];
}
}
if (result == 100000) {
result = 0;
}
cout << result;
return 0;
}
'개발자 > algorithm' 카테고리의 다른 글
백준 2143번 : 두 배열의 합 (c++) (0) | 2020.08.16 |
---|---|
백준 2096번 : 내려가기 (c++) (0) | 2020.08.16 |
백준 2805번 : 나무 자르기 (c++) (0) | 2020.08.16 |
백준 2003번 : 수들의 합 2 (c++) (0) | 2020.08.16 |
백준 3425번 : 고스택 (c++) 확인사항 (0) | 2020.08.15 |