티스토리 뷰

Algorithm/BOJ

[백준 16566] 카드 게임

giiro 2021. 3. 17. 18:27

문제

www.acmicpc.net/problem/16566

 

16566번: 카드 게임

첫째 줄에 세 개의 자연수 N, M, K가 주어진다. (1 ≤ M ≤ N ≤ 4,000,000, 1 ≤ K ≤ min(M, 10,000)) 다음 줄에 카드의 번호를 나타내는 M개의 자연수가 주어진다. 각각의 수들은 1 이상이고 N 이하이며 서로

www.acmicpc.net

 

풀이

낼 수 있는 카드를 정렬해둔 후, upperbound를 통해 낼 카드 번호를 바로 구할 수 있을 것 같지만 낸 카드는 버리기에 사용한 카드의 유무를 저장하는 배열을 사용해 항상 사용하지 않은 카드를 내는 식으로 해결할 수 있습니다.  $O((m + k)logm)$

 

코드

#include <bits/stdc++.h>
using namespace std;

int n, m, k, x, idx;
vector<int> v;
bool c[4000001];

int main() {
	cin.tie(NULL); cout.tie(NULL);
	ios_base::sync_with_stdio(false);
	
	cin >> n >> m >> k;
	v.resize(m);
	for (int& i : v) cin >> i;
	sort(v.begin(), v.end());
	while (k--) {
		cin >> x;
		idx = upper_bound(v.begin(), v.end(), x) - v.begin();
		while (idx <= n && c[idx]) idx++;
		cout << v[idx] << "\n";
		c[idx] = 1;
	}
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준 13018] 특이한 수열  (0) 2021.07.02
[백준 7812] 중앙 트리  (0) 2021.06.21
[백준 7045] Tree Cutting  (0) 2021.03.17
[백준 5867] Scrambled Letters  (0) 2021.02.07
[백준 20438] 출석체크  (0) 2021.01.08
댓글