728x90

시험 감독

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

문제

총 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)

출력

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


삼섬SW역량테스트 기출문제 4번째

시험감독이라는 문제!

 

이번문제는 생각보다 빨리 풀었다. 문제를 풀어보면 알겠지만 쉬운문제다... 빨리 풀었다고 하기 민망하네..

근데 제출했는데 계속 틀렸데!! 아무리 봐도 다맞는데 테스트케이스 다 정답떳는데 뭐지?! 하고 봤다가

최대 시험장의수(1,000,000) x 각 시험장의 최대 응시자수(1,000,000) = 1,000,000,000,000 으로 INT 범위 초과!! 발생

 

문제도 쉬웠으니까 INT 범위에 대해서 간략하게 써보자. C++은 int 의 최대 범위가 21억..얼마정도이다. 정확히는

2,147,483,647 보통 문제에서는 #include <limits.h> 를 이용해서 INT_MAX 이거나 #define MAX 1e9 이거나 사용하는데

이번문제는 그 범위를 초과한다. 그럼 long long의 최대 값는 얼마냐면 9,223,372,036,854,775,808이다.

따라서 문제에서 요구하는 최대 범위를 충분히 표현할 수 있으므로 가능하다.

 

생각해보면 체점할때 1% 도 안올라가고 틀렸다고 나오는게  INT 범위를 초과하는 수를 알 수있냐 물어보는 듯 싶다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#define MAX 1000001
using namespace std;
//n : 시험장의수  
//b : 총감독관이 감시할수있는 응시생의 수 (총감응수)
//c : 부감독관이 감시할수있는 응시생의 수 (부감응수)
int n, b, c ;
int room[MAX];
long long ans;
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> room[i];
    }
    cin >> b >> c;
    //1. 총감독관은 반드시 1명씩 들어가야한다.
    for (int i = 0; i < n; i++)
    {
        ans++;
        room[i] -= b;
    }
    //2. (남은 응시생수) / (부감응수)
    while (true)
    {
        bool flag = false;
        int cnt=0;
        for (int i = 0; i < n; i++)
        {
            if (room[i] <= 0)
                cnt++;
        }
        if (cnt == n)
            flag = true;
        if (flag)
            break;
        for (int i = 0; i < n; i++)
        {
            if (room[i] > 0)
            {
                int tmp1 = room[i] / c;
                int tmp2 = room[i] % c;
                ans += tmp1;
                if (tmp2 != 0)
                    ans++;
                room[i] = 0;
            }
        }
    }
 
    cout << ans;
    return 0;
}
cs

 

LIST

+ Recent posts