알고리즘

BOJ 19700 : 수업

minbear 2024. 1. 8. 23:11

 

#BOJ 19700 : 수업

 

19700번: 수업

키가 188cm, 154cm인 학생들을 한 팀으로, 키가 180cm, 161cm인 학생들을 한 팀으로, 키가 172cm인 학생을 혼자 팀으로 묶으면 총 3개의 팀을 구성할 수 있다. 더 적은 갯수의 팀으로 학생들을 묶을 수 있

www.acmicpc.net

#풀이

multiset을 이용하여 multiset의 메소드인 lower_bound 를 사용하여 해결할 수 있다.

 

키와 k를 받지만 사실 키는 신경쓰지 않아도 된다. 그 이유는 키가 큰 순서대로 정렬하여 각 팀에 있는 인원 수 가 k보다 작은 곳에 들어가야하므로 k만 생각하고 풀면 된다.

 

multiset을 사용하여 팀의 각 몇명있는지 확인하여 k보다 작은 팀중에서 가장 많은 수의 팀원이 있는 팀을 들어가야한다.

 

multiset을 사용하는 이유는 이진트리로 구현되어 있고 set이랑 다르게 중복이 가능하다.

각 팀의 팀원의 수가 같을 수 도 있으므로 팀원 수가 중복되어야 한다.

 

#코드 

 

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int n;
int ans = 0;
vector<pair<int,int>> v;
multiset<int> team;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for (int i = 0; i < n; i++) {
		int h; int k;
		cin >> h >> k;
		v.push_back({ h,k });
	}
	sort(v.begin(), v.end());
	
	for (int i = n-1; i >= 0; i--) {
		int cur = v[i].second;
		auto loc = team.lower_bound(cur);
		if (loc == team.begin()) team.insert(1);
		else {
			auto rloc = prev(loc);
			if (*rloc < cur)
			{
				int new_re = *rloc + 1;
				team.erase(rloc);
				team.insert(new_re);
			}
			else {
				team.insert(1);
			}
		}
	}
	
	cout << team.size() << '\n';
	return 0;
}