나로부터의 첫 번째 퍼즐, 기꺼이 개선을위한 제안!
시나리오는 다음과 같습니다. 급류 래프팅 회사의 관리자로 일합니다. 매일 아침, 예약 목록이 제공되며, 뗏목으로 분류해야합니다. 선택한 언어로 프로그램이나 기능을 작성하십시오.
각 뗏목은 최대 n
고객을 보유하고 있으며 각 예약은 1 n
명 에서 1 명까지 포함됩니다 (포함). 다음 규칙을 준수해야합니다.
그룹을 나눌 수 없습니다. 함께 예약 한 경우 모두 동일한 뗏목에 있어야합니다.
뗏목의 수를 최소화해야합니다.
두 가지 선행 규칙에 따라 그룹은 뗏목 사이에 최대한 균등하게 분산되어야합니다.
입력.
숫자 n
(이는 양의 정수라고 가정 할 수 있음) 및 모든 예약의 크기입니다. 당신의 언어가 그런 것들을 지원한다면 이것은 배열,리스트 또는 유사한 데이터 구조 일 수 있습니다. 이 모든 것은 1과 사이의 양의 정수 n
입니다. 예약 순서는 정의되어 있지 않으며 중요하지도 않습니다.
산출. 뗏목 하중으로 그룹화 된 예약 번호 목록. 그룹화는 다음과 같이 분명하게 표시되어야합니다.
- 리스트 또는 배열의 배열
- 각 뗏목에 대한 쉼표로 구분 된 목록. 각 뗏목 사이의 줄 바꿈.
세 번째 규칙을 구현하는 방법은 사용자의 몫이지만 평균 뗏목 점유율을 찾고 가능한 한 편차를 최소화해야합니다. 다음은 몇 가지 테스트 사례입니다.
n Bookings Output
6 [2,5] [5],[2]
4 [1,1,1,1,1] [1,1,1],[1,1]
6 [2,3,2] [2,2],[3]
6 [2,3,2,3] [2,3],[2,3]
6 [2,3,2,3,2] [2,2,2],[3,3]
12 [10,8,6,4,2] [10],[8,2],[6,4]
6 [4,4,4] [4],[4],[4]
12 [12,7,6,6] [12],[7],[6,6]
가장 짧은 코드로 표준 규칙이 적용됩니다. 즐기세요!
편집; 세 번째 규칙에 대해 가능한 한 동일하게 정의하는 제안 된 방법 입니다.
뗏목의 수가 r
결정 되면 (두 번째 규칙에 따름), 평균 점유량 a
은 예약을 합산하고로 나누어 계산할 수 있습니다 r
. 각 뗏목에 대해 평균 점유율과의 편차는을 사용하여 찾을 수 있습니다 d(x) = abs(n(x)-a)
. 여기서 n(x)
각 뗏목의 인원수는 1 <= x <= r
입니다. f(y)
엄격하게 양수이고 모든 양수에 대해 엄격하게 양의 1 차 및 음수가 아닌 2 차 도함수를 갖는 연속적인 단일 값 함수의 경우 모든 y
음 F
의 합계로 음이 아닌 양을 정의 합니다 f(d(x)), 1 <= x <= r
. 처음 두 규칙을 충족시키는 뗏목 할당을 선택 F
하고 전체 최소값과 동일한 곳 은 세 번째 규칙도 충족합니다.
g(y) = y
(두 번째 파생 0) 또는 g(y) = y²
(첫 번째 0 사용)을 사용할 수 없다는 것에 놀랐습니다 y = 0
.