해커톤
면접 대비시간 제한2초메모리 제한512 MB
N명의 학생을 팀으로 나눌 때 각 학생이 허용하는 팀 크기 Xi를 넘지 않게 하면서 팀 수를 최소로 구합니다.
문제
알버트가 다니는 학교에서 곧 해커톤이 열린다. 이 해커톤에는 N명의 학생이 참가 의사를 밝혔다. 편의상 학생에 번호를 매겼고, 번호는 1부터 N까지이다.
해커톤에 참가하는 N명을 몇 개의 팀으로 나눠야 하는데, 대회 주최 측에서는 팀의 개수를 최소로 하고 싶어 한다. 단, i번 학생은 자신이 속한 팀의 팀원 수가 자기 자신을 포함해서 Xi명 이하일 때만 참가한다고 한다. 주최 측은 참가 의사를 밝힌 N명이 모두 참여할 수 있도록 팀을 배정할 생각이며, 이 때 팀의 수를 최소로 하려고 한다.
다음 조건을 모두 만족하게 팀을 만들어야 한다.
- 한 학생은 하나의 팀에 소속되어야 한다.
- 각 팀은 최소 한 명의 학생을 포함한다.
- 모든 i에 대해서, i번 학생이 속한 팀의 팀원 수는 Xi명 이하이어야 한다.
위의 조건을 만족하면서 N명을 팀으로 나눴을 때, 팀의 수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에는 학생의 수 N(1 ≤ N ≤ 100,000)이 주어진다.
둘째 줄에는 N개의 정수가 주어지고, 순서대로 X1, X2, ..., XN을 의미한다. 모든 i에 대해서, 1 ≤ Xi ≤ N을 만족한다.
출력
첫째 줄에 팀의 수의 최솟값을 출력한다.
힌트
예를 들어, 5명의 학생이 있고, X1 = 1, X2 = 2, X3 = 5, X4 = 2, X5 = 1인 경우에 팀의 수의 최솟값은 4이다.
{1}, {2}, {3}, {4}, {5}로 5개의 팀을 만드는 방법이 있지만, 이것은 팀의 수가 최소가 아니다. {1}, {3}, {5}, {2, 4}와 같이 팀을 만들면, 문제의 조건을 모두 만족하고, 팀의 수도 최소이다.