알고리즘 문제/[백준]

[백준] 13458 시험 감독

latter2005 2020. 11. 29. 21:40

문제 주소 : 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

문제 확인

 

특별한 알고리즘을 필요로 하는 문제는 아닙니다.

각 시험자의 응시자 수가 먼저 입력으로 주어지므로 배열에 저장해둔 후 감독관 정보를 받아 해결합니다.

각 시험장의 학생의 수가 총감독관이 감시 가능한 학생의 수를 넘는다면 계산이 필요하고 넘지 않는다면 1명을 추가합니다.

 

풀이

 

시험장에 있는 학생의 수가 총감독관이 감시할 수 있는 학생 수를 넘는지 조건을 통하여 풉니다.

시험장의 학생 수 : student

총 감독관이 감시할 수 있는 학생 수 : B

부 감독관이 감시할 수 있는 학생 수 : C

  1. student <= B  =  1명
  2. student > B 경우 필요로 하는 최소의 부 감독관 수를 찾아야 합니다. 

student - B의 값에서 C 값을 나누어 계산할 수 있습니다.

이때 주의해야 할 점은 1~C까지 필요한 감독관 수가 1명이며, C+1~2*C까지 필요한 감독관 수가 2명입니다. 나눗셈은 0~C-1 까지를 0, C~2*C-1까지를 1로 만들어 버리기 때문에 나눗셈에는 student - B - 1의 값을 사용합니다.

 

코드

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
#include <stdio.h>
#include <unistd.h>
namespace io {
    const signed IS = 1 << 21, OS = 1 << 20;
    char I[IS + 1], * J = I;
    //char O[OS], *K = O;
    inline void daer() { if (J >= I + IS - 64) { char*= I; do*p++ = *J++while (J != I + IS); p[read(0, p, I + IS - p)] = 0; J = I; } }
    template<int N = 10typename T = int>inline T getu() { daer(); T x = 0int k = 0do x = x * 10 + *- '0'while (*++>= '0'&&++< N); ++J; return x; }
    template<int N = 10typename T = int>inline T geti() { daer(); bool e = *== '-'; J += e; return(e ? -1 : 1)*getu<N, T>(); }
    
    struct f { f() { I[read(0, I, IS)] = 0; }~f() { /*flush();*/ } }flu;
    
    /*
    inline void flush() { write(1, O, K - O); K = O; }
    template<int N = 10, typename T = int>inline void putu(T n) { char s[(N + 7) / 8 * 8], *p = s; int k = 0; do*p++ = n % 10 + 48; while ((n /= 10) && ++k < N); do*K++ = *--p; while (p != s); *K++ = 10; if (K >= O + OS - 64)flush(); }
    template<int N = 10, typename T = int>inline void puti(T n) { if (n < 0)*K++ = '-', n = -n; putu<N, T>(n); }
    */
};//출처 : https://cgiosy.github.io/posts/fast-io
using namespace io;
int main() {
    int b, c, n;
    int a[1000001];
    long long r = 0;
    n = getu();
    for (int i = 0; i < n; i++)//배열에 저장
        a[i] = getu();
    b = getu();
    c = getu();
    for (int i = 0, t = a[i] - b; i < n; t = a[++i] - b)
        r += (t > 0) ? (t - 1/ c + 2 : 1;//연산
    printf("%lld", r);
}
 
cs
반응형