10984번: 내 학점을 구해줘
문제)
길이가 인 수열 가 있다. 수열 는 1 이상인 정수로 이루어져 있다.
수열 에서 원하는 위치에 있는 수를 골라 최대 번 삭제를 할 수 있다.
예를 들어, 수열 가 다음과 같이 구성되어 있다고 가정하자.
수열 S : 1 2 3 4 5 6 7 8
수열 에서 4번째에 있는 4를 지운다고 하면 아래와 같다.
수열 S : 1 2 3 5 6 7 8
수열 에서 최대 번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 구해보자.
입력 :
수열 의 길이 와 삭제할 수 있는 최대 횟수인 가 공백으로 구분되어 주어진다.
두 번째 줄에는 수열 를 구성하고 있는 개의 수가 공백으로 구분되어 주어진다.
출력 :
수열 에서 최대 번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 출력한다.
풀이)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
// 22862. 가장 긴 짝수 연속한 부분 수열 (large)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, k;
vector<int> vec;
int even;
int odd;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
vec.resize(n);
for (int& i : vec) cin >> i;
// 투포인터 이동
int s = 0;
int e = 0;
int ans = 0;
// 배열의 끝까지 반복한다.
while (e < n)
{
// 만약 홀수의 개수가 k보다 작다면
if (odd <= k)
{
// e번 인덱스의 있는 수를 추가한다.
// 해당 수가 홀수일 경우
if (vec[e] % 2)
{ // 홀수 개수 추가
odd++;
}
// 해당 수가 짝수일 경우
else
{ // 짝수 개수 추가하고
even++;
// 짝수의 개수 최댓값 갱신
ans = max(ans, even);
}
e++;
}
// 홀수의 수가 k개를 넘어섰다면
else if (odd > k)
{
// k개 보다 작아질때까지 s++를 해준다.
if (vec[s] % 2)
{
odd--;
}
else
{
even--;
}
s++;
}
}
cout << ans;
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/22862
22862번: 가장 긴 짝수 연속한 부분 수열 (large)
수열 $S$에서 최대 $K$번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 출력한다.
www.acmicpc.net
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 16926번 : 배열 돌리기 1 (C++) (0) | 2023.09.08 |
---|---|
[백준] 2231번 : 분해합 (C++) (0) | 2023.09.08 |
[백준] 5557번 : 1학년 (C++) (0) | 2023.09.07 |
[백준] 1566번 : 스티커 (C++) (0) | 2023.09.06 |
[백준] 9465번 : 스티커 (C++) (0) | 2023.09.06 |