가능한 빨리“작업을 완료하십시오”


20

배경

지루하게 지루한 직업을 가지고 있다고 상상해보십시오. 매일 아침, 그 날에해야 할 일들을 모아 놓았습니다. 각 작업에는 일정한 기간이 있으며 일단 시작되면 한 번에 완료해야합니다. 상사는 유휴를 용납하지 않으므로 집에 가기 전에 아직 완료 할 수있는 작업이 있으면 그 중 하나를 수행해야합니다 (어느 쪽을 선택할 수 있는지). 반대로, 남아있는 모든 일로 인해 초과 근무가 필요한 경우 일찍 집에 가야합니다! 따라서 목표는 영리한 일정으로 업무 시간을 최소화하는 것입니다.

재미있는 사실 : 이것은 게으른 관료주의 일정 문제 의 한 변형 이며 NP-hard ( source )입니다.

입력

근무일의 "시간 단위"수 (양의 정수 L)와 작업 모음 ( T작업 기간을 나타내는 비어 있지 않은 양의 정수 배열)의 두 가지 입력이 있습니다 . 그것들은 임의의 순서와 합리적인 형식으로 취할 수 있습니다. 배열 T에는 기간이 초과 된 작업이 포함되어있을 수 L있지만 최대 기간이있는 작업이 하나 이상 포함되어 있어야 L합니다.

산출

유효한 일정은 작업의 하위 집합입니다 S ⊆ T같은 것을 sum(S) ≤ L, 그리고 모든 작업 S(계산 다중성)은 엄격 이상의 기간이 있습니다 L - sum(S). 출력은 유효한 일정의 가장 작은 합계입니다. 다시 말해, 오늘 작업해야하는 최소 시간 단위를 출력해야합니다.

입력을 고려하십시오

L = 9
T = [3,4,4,4,2,5]

하루 일정을 잡는 한 가지 방법은 [4,4]8 개의 시간 단위로 2 개의 작업을 완료하고 1 개의 단위를 남겨 둡니다. 사용 가능한 1 단위 작업이 없으므로 집에 갈 수 있습니다. 그러나 일정 [2,5]이 더 좋습니다. 7 개의 시간 단위로 작업 한 다음 나머지 모든 작업에는 3 개 이상의 시간 단위가 필요합니다. [2,4]6 시간 단위로 작업 한 후에도 3 단위 작업을 완료하기에 충분한 시간이 남아 있으므로 스케줄 이 유효하지 않습니다. 7 단위가 최적으로 밝혀 지므로 올바른 출력은 7입니다.

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다. 시간 제한이 없으므로 무차별 강제 적용은 완벽하게 허용됩니다.

테스트 사례

이것들은 형식으로 제공됩니다 L T -> output.

 1 [1,2] -> 1
 6 [4,1] -> 5
 7 [7,7,9] -> 7
 9 [3,4,4,4,2,5] -> 7
20 [6,2,3,12,7,31] -> 17
42 [7,7,7,7,8,8,8] -> 36
42 [7,7,7,7,7,8,8,8] -> 35
42 [7,7,7,7,7,7,8,8,8] -> 36
16 [1,2,3,4,5,6,7,8,9,10] -> 13
37 [15,27,4,1,19,16,20,26,29,18] -> 23
22 [24,20,8,8,29,16,5,5,16,18,4,9] -> 18
80 [10,22,11,2,28,20,27,6,24,9,10,6,27,2,15,29,27] -> 71
59 [26,28,5,4,7,23,5,1,9,3,7,15,4,23,7,19,16,25,26] -> 52

답변:


3

젤리, 20 바이트

³œ-;⁴Ṃ;¹S>⁴
ŒPÇÐfS€Ṃ

온라인으로 사용해보십시오!

TIO는 간신하더라도 60 초 시간 내에 마지막 테스트 사례를 완료 할 수있을 정도로 빠릅니다.

배경

이 알고리즘은 간단하고 비효율적입니다.

  1. 다중성을 계산 하여 T의 모든 하위 집합을 생성합니다 .

  2. 다음 기준 중 하나를 만족하는 하위 집합 S 만 유지하면서 하위 집합을 필터링합니다.

    • S가 상이한 T 및 요소의 합 S 와 최소 요소 하지 에서 S는 보다 큰 L .

    • ST 는 동일합니다.

    필터링 된 T ( T '라고 함 )에는 이제 충분한 작업 (또는 초과 근무)을 수행하는 모든 작업 목록이 포함됩니다.

  3. 모든 S 에서 'T , 합이 최소 하나를 선택하십시오.

작동 원리

ŒPÇÐfS€Ṃ     Main link. Left input: T (list). Right input: L (integer).

ŒP           Powerset; generate all subsets of T.
   Ðf        Filter them...
  Ç            applying the helper link.
     S€      Compute the sum of each kept subset.
       Ṃ     Take the minimum.

³œ-;⁴Ṃ;¹S>⁴  Helper link. Input: A (subset of T)

³œ-          Multiset subtraction; remove the elements of A from T, counting
             multiplicities.
   ;⁴        Append L to the resulting list.
     Ṃ       Take the minimum.
             If S == T, the difference was empty and the minimum is L.
      ;¹     Prepend the minimum to A.
        S    Compute the sum.
         >⁴  Compare it with L.
             If S == T, the comparison will return 1.

1

Pyth, 26 25 바이트

JEhSsMf&gJsT>hS.-QT-JsTyQ

온라인으로 사용해보십시오. 테스트 스위트.

나는 마지막 두 가지 테스트 사례를 실행할 수 없었지만 (온라인으로 시간이 초과되었다고 가정합니다) 다른 모든 사례는 작동합니다. 이것은 기본적인 무차별 대입 솔루션입니다.


1

루비, 124 바이트

->(m,s){
f=proc{|l,t|t.reject!{|x|x>l}
(0...(t.size)).map{|x|
f.call(l-t[x],t[0,x]+t[(x+1)..-1])
}.max||l
}
m-f.call(m,s)
}

이것은 무차별 대입 솔루션입니다.


1

MATL , 36 바이트

iTFinZ^!"2G@2#)sXKt1G>~wb+lG>A*?KhX<

온라인으로 사용해보십시오!

i           % input number L
TF          % array [true, false]
in          % input array T. Get its length
Z^!         % Cartesian power and transpose. Each column is a selection from T
"           % for each selection
  2G@2#)    %   take non-selected and then selected tasks
  sXK       %   sum of selected tasks. Copy to clipboard K
  t1G>~     %   duplicate. Is sum of selected tasks <= L?
  wb        %   swap, rotate
  +         %   sum of selected tasks plus each non-selected task
  lG>A      %   are all of those numbers greater than L?
  *         %   are both conditions met?
  ?         %   if so
    Kh      %     paste current minimum (or initially L), append new value
    X<      %     compute new minimum
            %   end if implicitly
            % end for each implicitly
            % display stack implicitly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.