문제 주소 : 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
- student <= B = 1명
- 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*p = I; do*p++ = *J++; while (J != I + IS); p[read(0, p, I + IS - p)] = 0; J = I; } }
template<int N = 10, typename T = int>inline T getu() { daer(); T x = 0; int k = 0; do x = x * 10 + *J - '0'; while (*++J >= '0'&&++k < N); ++J; return x; }
template<int N = 10, typename T = int>inline T geti() { daer(); bool e = *J == '-'; 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 |
반응형
'알고리즘 문제 > [백준]' 카테고리의 다른 글
[백준] 20119번: 클레어와 물약 (0) | 2020.12.03 |
---|---|
[백준] 20120번: 호반우와 리듬게임 (0) | 2020.12.03 |
[백준] 20118번: 호반우가 길을 건너간 이유 (0) | 2020.11.29 |
[백준] 13907 세금 (2) | 2020.11.05 |
[백준] 16235번 나무 재테크 (0) | 2020.11.02 |