알고리즘/문제 풀이

13458번: 시험 감독

Themion 2022. 1. 10. 14:12

https://www.acmicpc.net/problem/13458

 

13458번: 시험 감독

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

www.acmicpc.net

각 시험장에 총감독관은 반드시 한 명이 있으므로, 각 시험장에서 총감독관이 감시 가능한 응시자는 제외한다. 그 후 응시자가 남았다면, 필요한 부감독관의 수는 각 강의실에서 총감독관이 감시하지 못하는 응시자 A_i와 부감독관 한 명이 감시 가능한 응시자 수 C에 대해 A[i] / C + (bool)(A[i] % C) 명이 된다. 따라서 모든 강의실에 대해 부감독관의 수를 계산한 뒤, 강의실의 수( = 총감독관의 수)를 더한 값을 출력하면 정답을 얻을 수 있다.

#include <iostream>

using namespace std;

#define MAX_N 1000000

int main(){
    // 입출력 속도 향상
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    // N: 시험장 수, A[i]: i번째 시험장에 있는 응시자 수
    // B: 총감독관이 감독하는 응시자 수, C: 부감독관 한 명이 감독하는 응시자 수
    int N, A[MAX_N], B, C;
    unsigned long long ans = 0;
    
    // 문제의 조건을 입력받은 뒤
    cin >> N;
    for (int i = 0; i < N; i++) cin >> A[i];
    cin >> B >> C;

    // 각 시험장에 대해
    for (int i = 0; i < N; i++) {
        // 총감독관이 감독할 수 있는 응시자는 제외한 뒤
        A[i] -= B;
        // 남은 응시자가 있다면 필요한 부감독관의 인원수를 계산해 ans에 더한다
        if (A[i] > 0) ans += A[i] / C + (bool)(A[i] % C);
    }

    // 각 시험장에 총감독관은 반드시 한 명씩 존재하므로
    // 부감독관 수의 총합에 시험장 수를 더한 값을 출력한다
    cout << ans + N << '\n';

    return 0;
}