아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

시스템 호출

시간 제한1초메모리 제한512 MB

요약
모든 파일에 쓸 버퍼 크기 K를 하나 정해, 각 파일마다 ceil(F_i/K) 곱하기 (T+K)의 합을 최소로 만드는 K를 구한다.
난이도

어려움10점 중 8점

유형
수학, 정수론, 완전 탐색, 구현
정답자
아직 제출이 없습니다

문제

유닉스 계열 운영체제에서는 파일을 읽기 위해 read()라는 시스템 호출을 제공한다. 크기가 KK바이트인 버퍼를 전달하면, read()는 그 버퍼에 파일을 읽어 들이며, 한 번 호출하는 데 걸리는 시간은 (T+K)(T + K)이다. 여기서 TT는 호출 한 번당 고정적으로 걸리는 시간이다. 이 수행 시간은 버퍼의 크기에만 의존하고, 실제로 읽은 바이트 수에는 의존하지 않는다. 예를 들어 버퍼 크기가 10바이트이면 3바이트를 읽든 7바이트를 읽든 항상 (T+10)(T + 10)의 시간이 걸린다.

크기가 FF바이트인 파일 하나를 읽으려면 read()를 ⌈F/K⌉\lceil F / K \rceil번 호출해야 한다. 크기가 F1,F2,…,FNF_1, F_2, \dots, F_N바이트인 NN개의 파일을 모두 읽는 데 걸리는 총 시간은 다음과 같다.

∑i=1N⌈Fi/K⌉×(T+K)\sum_{i=1}^{N} \lceil F_i / K \rceil \times (T + K)

민규는 모든 파일에 같은 버퍼 크기 KK를 사용하기로 했다. 단, KK는 1 이상의 정수이다. 총 읽기 시간을 가장 짧게 만드는 버퍼 크기 KK를 구하라.

입력

첫째 줄에는 파일의 개수 NN이 주어진다. 둘째 줄에는 각 파일의 크기를 나타내는 NN개의 자연수 FiF_i가 바이트 단위로 주어진다. 셋째 줄에는 고정 호출 시간 TT가 주어진다. TT는 0 이상의 정수이다.

출력

주어진 파일을 모두 읽는 데 걸리는 가장 짧은 총 시간과, 그 시간을 달성하는 버퍼 크기 KK를 공백으로 구분하여 출력한다. 가장 짧은 시간이 되는 KK가 여러 개라면 그중 가장 작은 값을 출력한다.

힌트

Linux는 대표적인 유닉스 계열 운영체제이다. macOS 역시 유닉스 계열이며, 그 밖에 FreeBSD, NetBSD, Solaris 등이 있다.

예제3

  1. 예제 1

    입력
    3
    1 2 3
    1
    
    예상 출력
    12 1
    
  2. 예제 2

    입력
    4
    10 20 40 40
    10
    
    예상 출력
    180 20
    
  3. 예제 3

    입력
    5
    155 116 19 136 21
    0
    
    예상 출력
    447 1