알고리즘

백준 2891번 카약과 강풍 C++

영춘권의달인 2022. 1. 23. 11:58

출처 : https://www.acmicpc.net/problem/2891

 

1. 크기가 n + 1인 벡터를 원소들의 초기값을 1로 선언한다. (기본적으로 가지고 있는 카약은 1개)

2. 카약이 손상된 팀의 카약을 -1을 해준다.

3. 카약을 하나 더 가져온 팀의 카약을 +1 해준다.

4. 1번 팀부터 n번 팀까지 탐색하면서, 카약의 수가 0이면 왼쪽 먼저 확인해서 여유분이 있으면 빌리고,  없다면 오른쪽을 확인해서 여유분이 있으면 빌리고, 양쪽 다 없다면 어쩔 수 없이 출발하지 못하게 된다.

5. 최종적으로 출발하지 못하는 팀의 수를 구한다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>

using namespace std;
typedef long long ll;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n, s, r, input;
	cin >> n >> s >> r;
	vector<int> v(n + 1, 1);
	for (int i = 0; i < s; i++) {
		cin >> input;
		v[input]--;
	}
	for (int i = 0; i < r; i++) {
		cin >> input;
		v[input]++;
	}
	for (int i = 1; i <= n; i++) {
		if (v[i] == 0) {
			if (i == 1) {
				if (v[2] == 2) {
					v[1] = 1;
					v[2] = 1;
				}
			}
			else if (i == n) {
				if (v[n - 1] == 2) {
					v[n] = 1;
					v[n - 1] = 1;
				}
			}
			else {
				if (v[i - 1] == 2) {
					v[i - 1] = 1;
					v[i] = 1;
					continue;
				}
				if (v[i + 1] == 2) {
					v[i + 1] = 1;
					v[i] = 1;
				}
			}
		}
	}
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		if (v[i] == 0) cnt++;
	}
	cout << cnt;
};