나만의 작은 도서관
문제 13458.시험 감독(문제집) 본문
문제설명
시험을 치루는 응시자들이 각 시험장에 있다.
응시자를 감시하기 위해 총감독관과 부감독관은 시험장에 배치되어야 한다.
이 때, 총감독관은 각 시험장에 항상 1명이 있어야 하며, 부감독관은 여럿이 있어도, 없어도 된다.
총감독관은 B명을 감시할 수 있고, 부감독관은 C명을 감시할 수 있다.
모든 응시자들을 감시하는데 필요한 감독관 수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다.
셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)
입력 예제
3
3 4 5
2 2
Tips
1. 본감독관은 항상 시험장에 한 명씩 있다. 변동이 없는 요소이기 때문에 부감독관의 수를 구하기 전 미리 계산을 한다.
2. 모든 응시자를 감시해야 하니 한 방에 x.xxxx명의 부감독관이 필요하다면 아래 소수점을 올림해서 인원 수를 구하면 된다.
3. 항상 int를 조심하자 간단한 알고리즘 문제가 틀린다면 10에 9는 longlong을 쓰지 않았기 때문이다.
4. 배열은 int기준 10^5 정도가 넘으면 메모리 초과가 발생한다. 이러한 문제가 발생할 때, vector 자료형을 사용하면 손쉽게 메모리 초과 오류에서 벗어날 수 있다.(다음 코드와 같이)
정답 코드
#include <iostream>
#include <vector> // vector
#include <cmath> // ceil()
#define MAXN 1000000
using namespace std;
int main(void) {
int N;
vector<int> v(MAXN);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> v[i];
}
int B, C;
cin >> B >> C;
// 항상 int 범위를 생각하자.
long long main_inspector = N;
long long sub_inspector = 0;
for (int i = 0; i < N; i++) {
v[i] -= B;
if (v[i] > 0) sub_inspector += ceil((double)v[i] / C);
}
cout << main_inspector + sub_inspector << '\n';
return 0;
}
'백준 문제풀이 > Others' 카테고리의 다른 글
문제 1747. 소수&팰린드롬 (대학생 기본반 1번) (0) | 2024.03.19 |
---|---|
문제 1991.트리 순회 (대학생 심화반 6번) (0) | 2024.03.18 |
문제 2805.나무 자르기 (대학생 심화반 2번) (0) | 2024.03.18 |
문제 2003.수들의 합 2 (대학생 심화반 1번) (0) | 2024.03.18 |
문제 9012.괄호 (자료구조) (0) | 2023.09.10 |