본문 바로가기
알고리즘/BOJ(백준)

[ 백준-13458번 / 구현 ] 시험 감독 (삼성기출)

by 뎁꼼 2020. 3. 9.

1. 문제


시험 감독

시간 제한메모리 제한제출정답맞은 사람정답 비율

2 초 512 MB 37392 9778 7026 25.062%

문제

총 N개의 시험장이 있고, 각각의 시험장마다 응시자들이 있다. i번 시험장에 있는 응시자의 수는 Ai명이다.

감독관은 총감독관과 부감독관으로 두 종류가 있다. 총감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 B명이고, 부감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 C명이다.

각각의 시험장에 총감독관은 오직 1명만 있어야 하고, 부감독관은 여러 명 있어도 된다.

각 시험장마다 응시생들을 모두 감시해야 한다. 이때, 필요한 감독관 수의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다.

셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

출력

각 시험장마다 응시생을 모두 감독하기 위해 필요한 감독관의 최소 수를 출력한다.

예제 입력 1 복사

1 1 1 1

예제 출력 1 복사

1

예제 입력 2 복사

3 3 4 5 2 2

예제 출력 2 복사

7

 

 

 

 

 

2. 소스코드


- int의 범위는 약 +- 21억, +- 10^9 이다.

- 시험장의 개수가 10^6, 한 시험장 당 최대 감독수는 10^6. 감독관 최대 갯수는 10^12이다.

- long long의 범위는 약 +- 922경 3000조 이다.

- 감독관 수를 long long 으로 저장해야하는 게, 함정인 문제.

- long 출력은 %ld, long long 은 %lld 이다.

 

- 소스코드

#pragma warning (disable : 4996)
#include <cstdio>
#define MAX 1000000
using namespace std;

int room, appl[MAX], mainDirCap, subDirCap;
long long cnt;

int main() {

    scanf("%d", &room);
    for (int i = 0; i < room; ++i) {
        scanf("%d", &appl[i]);
    }
    scanf("%d %d", &mainDirCap, &subDirCap);

    for (int i = 0; i < room; ++i) {
        appl[i] -= mainDirCap;
        if (appl[i] > 0){
            cnt += (appl[i] / subDirCap);
            if (appl[i] % subDirCap) ++cnt;
        }
    }
    printf("%lld\n", cnt + room);
    return 0;
}