수열 $S$에서 $K$개의 원소를 임의로 삭제하였을 때, 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 구하는 문제이다.
- 수열에서 필요한 정보는 홀짝이니, $S[i] = S[i]\ \&\ 1$로 홀수면 1, 짝수면 0으로 $S$를 초기화해주자.
- 일정 범위에서 범위를 늘리면 포함되는 홀수, 짝수는 같거나 증가한다. 줄이면 같거나 감소한다.
- 나머지는 투포인터를 이용하여 개수를 세어주면 된다.
int N, K, S[MAXN];
int main(void) {
fastio;
cin >> N >> K;
for (int i = 1; i <= N; i++)
cin >> S[i], S[i] = (S[i] & 1);
int s = 1, e = 1;
int cnt = S[1], ans = !S[1], tmp = !S[1];
while (s <= e && e < N) {
if (cnt <= K) {
e++;
cnt += S[e];
tmp += !S[e];
ans = max(ans, tmp);
}
while (cnt > K) {
cnt -= S[s];
tmp -= !S[s];
s++;
}
}
cout << ans;
return 0;
}
'알고리즘' 카테고리의 다른 글
[BOJ 2829] 아름다운 행렬 (0) | 2024.04.29 |
---|---|
[BOJ 17952] 과제는 끝나지 않아! (0) | 2024.04.29 |
[BOJ 22858] 원상 복구 (small) (0) | 2024.04.02 |
[BOJ 11508] 2+1 세일 (0) | 2024.04.01 |
[BOJ 9660] 돌 게임 6 (0) | 2024.04.01 |