반응형
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
문제
10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
출력
첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
#include <iostream>
#include <vector>
using namespace std;
const int INF = 987654321;
int N , M ;
int arr[100001];
int ans = INF;
int main(){
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
for(int i = 0; i < N ;i++){
cin >> arr[i];
}
int low =0 , high = 0;
int sum = arr[0];
while (low<= high && high < N){
if(sum < M ){
high++;
sum += arr[high];
}
else if(sum == M ){
ans = min(ans , high - low +1);
high++;
sum += arr[high];
}
else{ // sum > M
ans = min(ans , high - low +1);
sum -= arr[low];
low++;
}
}
if(ans == INF){
cout << 0;
}
else{
cout << ans;
}
return 0;
}
반응형
'Algorithm > BOJ' 카테고리의 다른 글
백준 게임 개발 (0) | 2021.03.29 |
---|---|
백준 문자열 폭발 (0) | 2021.03.25 |
51. SW_Test 연습 백준 스타트링크 (0) | 2021.03.02 |
50. SW_Test 연습 백준 보물섬 (0) | 2021.03.02 |
48. SW_Test 연습 백준 가장 긴 증가하는 부분 수열 2 (0) | 2021.02.24 |
댓글