알고리즘 문제 풀이/백준 온라인 저지
백준 1806 부분합 C++
Hugxy
2019. 8. 16. 13:24
https://www.acmicpc.net/problem/1806
투포인터를 활용해주면 된다.
길이를 언제 갱신하고, 무한루프를 어느 위치에서 종료할 것인지만 명확히 해준다면 무리없이 풀리는 문제이다.
현재까지 더한 구간합이, 넘겨야할 합보다 크다면 일단 그 시점의 길이가 최소 길이인지 비교해서 갱신해준다.
이후 왼쪽 인덱스 포인터를 증가시키고 길이를 감소시키고, 변화된 상태가 조건을 만족하는지 확인해주고 이런 흐름이다.
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 | #include<iostream> using namespace std; typedef long long ll; const int INF = 1000000; int main(void) { ll arr[100001]; double s; int n; cin >> n >> s; for (int i = 0; i < n; i++) cin >> arr[i]; int l = 0, h = 0, len = 0, Min = INF; ll Sum = 0; while (1) { if (Sum < s) { if (h > n - 1) break; //h가 n인데, 쿼리를 실행하게 하면 안된다 Sum += arr[h]; h++; len++; } else { if (len < Min) Min = len; Sum -= arr[l]; l++; len--; } } if (Min != INF) cout << Min << '\n'; else cout << 0 << '\n'; return 0; } | cs |