Lợi nhuận cửa hàng đồ chơi


15

Câu chuyện

"2016? Al..right," người bán đồ chơi càu nhàu Hilbert. Anh mở mắt ra, lau nước sốt xà lách ra khỏi tai và ăn một ly cremechnitte khởi động buổi sáng. Ngày lễ mẫu mực. Anh ấy cần phải đi làm bây giờ, và hoàn thành kế toán năm.

Giáng sinh là khoảng thời gian rất năng suất trong năm, đặc biệt là doanh số của anh. Hilbert biết chính xác cách thức hoạt động của nó: Một người đi vào cửa hàng và mua món quà đầu tiên họ được cung cấp. Họ trả tiền cho nó và chạy đến một cửa hàng khác. Trong thực tế, những gì món quà thực sự không thực sự tạo ra sự khác biệt. Giá cả cũng không liên quan, miễn là nó không quá cao. Tất cả phụ thuộc vào thời gian còn lại cho đến Giáng sinh - thời gian càng ngắn, sự hối hận của khách hàng càng lớn, mức giá mà họ sẵn sàng trả càng lớn.

Tất cả những gì nó cần cho Hilbert là nhìn vào đồng hồ của anh ấy - và anh ấy biết ngay khách hàng của mình có thể chi bao nhiêu. Anh ta có thể dễ dàng tận dụng sự thật này: Anh ta chỉ tìm thấy món quà đắt nhất mà anh ta có thể bán cho một khách hàng nhất định, và cung cấp cho họ. Chỉ đến bây giờ anh mới nhận ra rằng anh đã quên sử dụng chiến lược xảo quyệt này vào năm ngoái. Điều đó sẽ thay đổi!

Tuy nhiên, Hilbert muốn biết doanh nghiệp của mình sẽ phát triển đến mức nào, nếu anh ta thực sự sử dụng kế hoạch lớn của mình. Anh quản lý để đưa ra một danh sách những người đến cửa hàng của anh, tuy nhiên anh không chắc mình có thể kiếm được bao nhiêu tiền từ họ.

Nhiệm vụ của bạn (TL; DR)

Đầu vào bao gồm một danh sách tăng dần về giá quà tặng có sẵn và danh sách ngân sách của khách hàng. Danh sách ngân sách theo thứ tự giống như khách hàng đã đến cửa hàng - với một điều kiện là mọi khách hàng đều sẵn sàng trả ít nhất là như trước đó, nghĩa là nó cũng tăng dần.

Đối với mỗi khách hàng, hãy tìm món quà đắt nhất mà họ sẵn sàng trả tiền và xuất ra giá của nó. Nếu không có quà tặng trong ngân sách có sẵn, đầu ra a 0.

Bạn nhận được -40%phần thưởng cho các ký tự, nếu độ phức tạp thời gian tiệm cận của thuật toán của bạn là O(n+m)(chứ không phải tầm thường O(n*m)) Đâu n, mlà độ dài của danh sách đầu vào.

Đây là , byte ngắn nhất sẽ thắng. Sơ hở tiêu chuẩn bị cấm.

Thí dụ

Đầu vào:

1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22

Đầu ra:

1 0 2 2 5 2 10 20 7 0

Nhiệm vụ này được lấy từ một cuộc thi lập trình địa phương, và được tôi dịch sang tiếng Anh. Đây là bài tập gốc: https://www.ksp.sk/ulohy/zadania/1131/


9
Tiền thưởng là một điều cần tránh khi viết thử thách . Tuy nhiên, tôi nghĩ rằng nó có thể tốt ở đây. Nếu bạn muốn giữ nó, tôi khuyên bạn nên thay đổi nó thành phần thưởng dựa trên phần trăm. Phần thưởng 20 ký tự không có ý nghĩa gì đối với việc gửi Java, nhưng về cơ bản là bắt buộc đối với các giải pháp trong ngôn ngữ chơi gôn.
Denker

Tôi có thể thưởng một khoản tiền thưởng cho OP cho backstory không? Thành thật mà nói, điều đó làm tôi mỉm cười; mỗi thử thách cần một trong những điều đó.
con mèo

@tac Cảm ơn, nhưng như được ghi chú trong văn bản nhỏ ở phía dưới, tôi đã không thực sự tạo nên cốt truyện - Tôi chỉ dịch nó.
sammko

@sammko vâng, tôi đã thấy điều đó, nhưng nhận xét trên của tôi vẫn giữ :)
mèo

Câu trả lời:


5

Bình thường, 17 16 byte

1 byte nhờ vào Pietu1998

VE=.-Q]
e|fgNTQ0

Trình diễn

Giải trình:

VE=.-Q]<\n>e|fgNTQ0
                        Implicit: Q is the list of prices.
VE                      For N in the list of budgets
             f   Q      Filter the list of prices
              gNT       On the current person's budget being >= that price
            |     0     If there aren't any, use 0 instead.
          e             Take the last (most expensive) value.
      <\n>              Print it out.
  =.-Q                  Remove it from the list of prices.

Tôi nghĩ bạn có thể tiết kiệm 1 byte với VE=.-Q]\ n e|fgNTQ0. Về cơ bản điều tương tự nhưng với một vòng lặp.
PurkkaKoodari 30/03/2016

4

Haskell, 67 byte

a#(b:c)|(h,t)<-span(<=b)a=last(0:h):(init(h++[0|h==[]])++t)#c
_#x=x

Ví dụ sử dụng: [1,2,2,2,5,7,10,20] # [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0].

Chia giá thành hai phần: (h,t)nơi hđều là giá <= ngân sách của khách hàng tiếp theo và tlà tất cả những người khác. Lấy giá cuối cùng của hvà tiếp tục đệ quy với tất cả nhưng cuối cùng hcộng tvà ngân sách còn lại. last(0:h)đánh giá 0nếu htrống. Tương tự: init (h++[0|h==[]]) ++ tthêm một phần tử giả 0vào hif htrống, do đó initcó một cái gì đó để bỏ ( initthất bại trong danh sách trống).


3

Java, 154 * 0,6 = 92,4 byte

-13 byte vì lambda thực sự có thể sử dụng int[], không Integer[](cảm ơn BunjiquoBianco )

Điều này sẽ mất thời gian O (n + m) và không gian bổ sung O (n + m) (giả sử tôi hiểu ký hiệu O lớn) .

g->b->{int l=g.length,L=b.length,G=0,B=0,A=0;int[]a=new int[l],s=new int[L];for(;B<L;){while(G<l&&g[G]<=b[B])a[A++]=g[G++];s[B++]=A>0?a[--A]:0;}return s;}

Thụt lề: ( Dùng thử trực tuyến! )

static int[] toyStore(int[]g,int[]b) {
    int gl=g.length,bl=b.length,gp=0,bp=0,ap=0;
    int[] a=new int[gl],s=new int[bl];
    for (;bp<bl;) {
        while(gp<gl&&g[gp]<=b[bp])a[ap++]=g[gp++];
        s[bp++]=ap>0?a[--ap]:0;
    }
    return s;
}

public static void main(String[] args)
{
    System.out.println(Arrays.toString(
        toyStore(new int[] {1,2,2,2,5,7,10,20},
                 new int[] {1,1,2,3,6,6,15,21,21,22})
        ));
}

Tôi cho thấy sự mở rộng không phải lambda ở đây vì khai báo kiểu sạch hơn và nó chính xác là logic. Lambda có mặt tại liên kết ideone.

Giải trình:

Các biến được sử dụng:

  • glà danh sách giá quà tặng, blà danh sách ngân sách.
  • gllà chiều dài gbllà chiều dài của b.
  • alà một Stack cho quà tặng giá cả phải chăng, slà mảng đầu ra của quà tặng được bán.
  • gp, bpapđược gợi ý cho g, batương ứng. bpcũng là con trỏ cho s.

Thuật toán:

  • Đối với mỗi ngân sách về độ dài của ngân sách
    • Trong khi ngân sách này có thể mua quà tặng tại g[gp]
      • Đẩy ngân sách lên Stack avà tăng dầngp
    • Bật đầu avào s[bp]nếu nó tồn tại, khác đặt 0.

Bạn có thể cà ri lambda? (tức là (g,b)->đến g->b->?
ASCII chỉ

@som somebody rõ ràng, vâng. Đối với một số lý do, nó không bao giờ làm việc cho tôi trước đây nhưng bây giờ nó sẽ. 0.o (Bạn đã lưu 0,6 byte sau phần thưởng.)
CAD97 28/03/2016

Bạn có thể lưu một số byte bằng cách sử dụng thời gian dài nếu đầu vào được giả sử là dài [] (đưa bạn tới 158byte) - ideone.com/invHlc
BunjiquoBianco

1
@BunjiquoBianco trên thực tế tôi chỉ có thể sử dụng int []. Vì một số lý do, tôi có ấn tượng rằng vì các đối số kiểu lấy các kiểu tham chiếu (do đó không phải là các nguyên hàm gõ giá trị như int) mà tôi cần để sử dụng một mảng các kiểu tham chiếu. Nhưng tôi có thể sử dụng một mảng int chỉ tốt. Tôi sẽ cập nhật một khi tôi có cơ hội.
CAD97

@ CAD97 Hà! Không thể tin rằng tôi đã không tạo liên kết đó ...
BunjiquoBianco

2

Haskell, 87 * 0,6 = 52,2 byte

g s(p:q)d@(b:c)|p<=b=g(p:s)q d
g[]p(b:c)=0:g[]p c
g(s:t)p(b:c)=s:g t p c
g _ _ _=[]
g[]

Hoàn toàn khác với câu trả lời khác của tôi , bởi vì tôi sẽ nhận tiền thưởng.

Dòng cuối cùng (-> g[]) không phải là một phần của định nghĩa, nhưng gọi qua đầu. Ví dụ sử dụng: g [] [1,2,2,2,5,7,10,20] [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0].

Về cơ bản hoạt động theo cách tương tự như câu trả lời của @ CAD97 , tức là sử dụng ngăn xếp trợ giúp (ban đầu trống) để theo dõi các mặt hàng có thể mua. Cụ thể: kiểm tra theo thứ tự:

  • nếu giá đầu tiên nhỏ hơn hoặc bằng ngân sách đầu tiên, hãy chuyển giá sang ngăn xếp. Gọi lại.
  • nếu ngăn xếp trống, trả về 0 theo sau là cuộc gọi đệ quy với ngân sách bị giảm.
  • nếu cả danh sách ngăn xếp và ngân sách đều không trống, hãy trả lại đầu ngăn xếp theo sau là một cuộc gọi đệ quy với ngăn xếp và ngân sách được bật.
  • khác trả về danh sách trống.

Điều này hoạt động m+nđúng lúc, bởi vì a) các thao tác trên ngăn xếp trợ giúp sử dụng thời gian không đổi và b) trong mỗi lệnh gọi đệ quy, một trong các danh sách được rút ngắn bởi một phần tử.


2

Thạch , 15 byte

ṀṄ;©®œ^
Rf@€ç/Ṁ

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

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

ṀṄ;©®œ^  Helper link. Arguments: G, H (lists of affordable gifts)

Ṁ        Compute the maximum of G (0 if the list is empty).
 Ṅ       Print it.
  ; ®    Concatenate it with the register (initially 0).
   ©     Save the result in the register.
     œ^  Compute the multiset symmetric difference of the updated register and H.

Rf@€ç/Ṁ  Main link. Arguments: B (budgets), P (prices)

R        Range; replace each t in B with [1, ..., t].
 f@€     Intersect the list of prices with each budget range, obtaining, for each
         customer, the list of all gifts he's willing to pay for.
    ç/   Reduce the array of lists by the helper link.
         In each iteration, this computes and prints the most expensive gift for
         a customer, than removes the selected gift (and all previously
         selected gifts) from the next list.
      Ṁ  Compute the maximum of the resulting list, which corresponds to the last
         customer.

1

JavaScript, 85 * 0,6 = 51 byte

f=(a,b,s=[],[t,...u]=a,[v,...w]=b)=>v?t<=v?f(u,b,[...s,t]):[s.pop()|0,...f(a),w,s)]:[]

Một bản sao khác của câu trả lời của @ CAD97.

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.