음식 배급량 정하기

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

요약
학생마다 최대 3번까지 배식받을 수 있을 때, 실수인 1인분 크기 S를 정해 a*(남긴 음식) + b*(배식 횟수)를 최소로 만들고 그 값을 기약분수로 출력한다.
난이도

보통10점 중 7점

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

문제

대학 학생 식당은 어떤 학생도 배고픈 채로 나가지 않기를 바란다. 그래서 학생이 아직 배가 고프면 언제든지 음식을 한 그릇 더 무료로 받을 수 있다. 식당은 학생마다 얼마나 먹을지 일일이 묻기에는 시간이 너무 오래 걸리므로, 항상 정해진 하나의 배급량 SS만큼씩 음식을 담아 준다. 이 때문에 학생이 마지막에 받은 그릇을 다 먹지 못할 수 있고, 남은 음식은 버려야 한다.

식당 관리자는 비용을 줄이기 위해, 버려지는 음식이 적으면서도 학생이 음식을 다시 받으러 가는 횟수가 너무 많지 않도록 배급량 SS를 정하고 싶다. 두 목표는 서로 충돌한다.

  • SS를 아주 작게 잡으면 버려지는 음식은 거의 없지만, 학생들이 음식을 받으러 가는 횟수가 많아진다.
  • SS를 아주 크게 잡으면 학생마다 한 번만 받아도 되지만, 버려지는 음식의 양이 많아질 수 있다.

관리자는 각 학생이 몇 단위의 음식을 먹는지 조사해 두었다. 버려지는 음식의 총량을 xx, 학생들이 음식을 받으러 가는 총횟수를 yy라 하자. 목표는 a⋅x+b⋅ya \cdot x + b \cdot y를 최소화하는 것이며, 가중치 aa와 bb는 두 목표의 상대적 중요도를 나타낸다. xx와 yy는 배급량 SS(양의 실수라면 무엇이든 될 수 있다)와 각 학생이 먹는 양에 따라 정해진다. 추가로 한 가지 규칙이 있다. 어떤 학생도 음식을 33번을 초과해 받으러 가서는 안 된다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 학생 수를 나타내는 정수 nn (1≤n≤10001 \le n \le 1000)이 주어진다. 다음 줄에는 두 정수 aa와 bb (1≤a,b≤101 \le a, b \le 10)가 주어진다. 셋째 줄에는 nn개의 정수 y1,…,yny_1, \ldots, y_n (1≤yi≤1001 \le y_i \le 100)이 주어지며, yiy_i는 학생 ii가 먹는 음식의 단위 수이다. 입력의 끝은 n=0n = 0인 줄로 표시되며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다, 가능한 모든 배급량 중에서 얻을 수 있는 a⋅x+b⋅ya \cdot x + b \cdot y의 최솟값을 한 줄에 출력한다. 값은 기약분수 p / q 형태로 출력한다. 값이 정수이면 분자만 출력하고 분모 11은 생략한다.

예제1

  1. 예제 1

    입력
    5
    1 1
    3 7 1 9 12
    3
    10 1
    11 13 17
    2
    2 3
    6 3
    0
    
    예상 출력
    35 / 2
    154 / 3
    9