Kết thúc công việc ngay lập tức


20

Lý lịch

Hãy tưởng tượng trong một khoảnh khắc mà bạn có một công việc nhàm chán đến khó chịu. Mỗi buổi sáng, bạn được giao một bộ sưu tập các nhiệm vụ mà bạn nên làm vào ngày hôm đó. Mỗi nhiệm vụ có một thời lượng nhất định và một khi bắt đầu, nó phải được hoàn thành trong một lần. Sếp của bạn sẽ không chịu được việc nhàn rỗi, vì vậy nếu có những nhiệm vụ mà bạn vẫn có thể hoàn thành trước khi về nhà, bạn phải làm việc với một trong số họ (bạn có thể chọn nhiệm vụ nào). Ngược lại, nếu tất cả các nhiệm vụ còn lại sẽ yêu cầu bạn phải làm thêm giờ, bạn phải về nhà sớm! Do đó, mục tiêu của bạn là giảm thiểu thời gian trong ngày làm việc của bạn bằng cách lập kế hoạch thông minh.

Sự thật thú vị: đây là một biến thể của vấn đề lập kế hoạch quan liêu lười biếng , và nó là NP-hard ( nguồn ).

Đầu vào

Bạn có hai đầu vào: số lượng "đơn vị thời gian" trong ngày làm việc của bạn (số nguyên dương L) và bộ sưu tập các nhiệm vụ (một mảng số nguyên dương không trống T, biểu thị thời lượng tác vụ). Chúng có thể được thực hiện theo bất kỳ thứ tự nào, và trong bất kỳ định dạng hợp lý. Mảng Tcó thể chứa các tác vụ có thời lượng nhiều hơn L, nhưng nó được đảm bảo chứa ít nhất một tác vụ có thời lượng nhiều nhất L.

Đầu ra

Một lịch trình có giá trị là một tập hợp con các nhiệm vụ S ⊆ Tnhư vậy sum(S) ≤ L, và mỗi nhiệm vụ không S(bội đếm) có thời gian nghiêm ngặt hơn L - sum(S). Đầu ra của bạn sẽ là tổng nhỏ nhất có thể của một lịch trình hợp lệ. Nói cách khác, bạn sẽ xuất số lượng đơn vị thời gian tối thiểu bạn phải làm việc hôm nay.

Thí dụ

Xem xét các đầu vào

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

Một cách để lên lịch cho ngày của bạn là [4,4]: bạn hoàn thành hai nhiệm vụ trong 8 đơn vị thời gian và còn lại 1 đơn vị. Vì không có nhiệm vụ 1 đơn vị có sẵn, bạn có thể về nhà. Tuy nhiên, lịch trình [2,5]thậm chí còn tốt hơn: bạn làm việc cho 7 đơn vị thời gian, và sau đó tất cả các nhiệm vụ còn lại sẽ mất 3 đơn vị thời gian trở lên. Lịch trình [2,4]không hợp lệ, vì sau khi làm việc cho 6 đơn vị thời gian, bạn vẫn có đủ thời gian để hoàn thành nhiệm vụ 3 đơn vị. 7 đơn vị hóa ra là tối ưu, vì vậy đầu ra chính xác là 7.

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Không có thời gian ràng buộc, vì vậy vũ phu là hoàn toàn chấp nhận được.

Các trường hợp thử nghiệm

Chúng được đưa ra trong định dạng 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

Câu trả lời:


3

Thạch, 20 byte

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

Hãy thử trực tuyến!

TIO đủ nhanh để hoàn thành các trường hợp thử nghiệm cuối cùng trong giới hạn thời gian 60 giây, ngay cả khi chỉ vừa đủ.

Lý lịch

Thuật toán vừa đơn giản vừa không hiệu quả:

  1. Chúng tôi tạo ra tất cả các tập hợp con của T , tính bội số.

  2. Chúng tôi lọc các tập hợp con, chỉ giữ lại những tập hợp con S đáp ứng một trong các tiêu chí sau:

    • S khác với T , và tổng của các phần tử của S và các yếu tố tối thiểu không trong S lớn hơn L .

    • ST giống hệt nhau.

    T được lọc (hãy gọi nó là T ' ) hiện chứa tất cả các danh sách công việc chỉ làm đủ công việc (hoặc thậm chí một số thời gian làm thêm).

  3. Trong tất cả S trong T ' , chọn một số có tổng thấp nhất.

Làm thế nào nó hoạt động

Œ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

Bình thường, 26 25 byte

JEhSsMf&gJsT>hS.-QT-JsTyQ

Hãy thử trực tuyến. Bộ thử nghiệm.

Tôi đã không thể chạy hai trường hợp thử nghiệm cuối cùng (chúng hết thời gian trực tuyến, tôi giả sử), nhưng tất cả các trường hợp khác đều hoạt động. Đây chỉ là một giải pháp vũ phu cơ bản.


1

Ruby, 124 byte

->(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)
}

Đây là một giải pháp vũ phu.


1

MATL , 36 byte

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

Hãy thử trực tuyến!

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.