https://www.acmicpc.net/problem/1806
처음에는 분할정복법으로 접근 하려다가 복잡해질 것 같아서 관두고 문제를 다시 그려봤다.
연속된 부분 구간을 구해야 하므로 순서는 뒤바뀌면 안 된다.
누적합을 구하면서 주어진 값 S가 넘을 경우 가장 오래전에 넣은 값을 제거해나간다.
FIFO 형식을 가지고 있어 간단하게 큐를 사용해주었다.
모든 요소가 최소 1번 큐에 들어가고, 큐에 있는 값을 제거해가면서 조건을 만족하는 최소 길이를 구할 수 있다.
int main(void) {
int n, s;
cin >> n >> s;
int* arr = new int[n];
for (int i = 0;i < n;i++) {
cin >> arr[i];
}
vector<int> S;
int sum = 0;
int minSize = n+1;
for(int i=0;i<n;i++) {
S.push_back(arr[i]);
sum += arr[i];
if (sum >= s) {
while (sum >= s) {
if (sum - S[0] >= s) {
sum -= S[0];
S.erase(S.begin());
}
else {
break;
}
}
minSize = min(minSize, (int)S.size());
}
}
if (minSize == n+1) cout << 0 << endl;
else cout << minSize << endl;
}