ผลกำไรร้านขายของเล่น


15

เรื่องราว

"2016? Al .right," ผู้ขายของเล่นบ่นฮิลแบร์ต เขาเปิดตาของเขาเช็ดน้ำสลัดไหลออกมาจากหูของเขาและกิน cremeschnitte เริ่มเตะตอนเช้า แบบอย่างวันหยุด เขาต้องไปทำงานตอนนี้และทำบัญชีให้เสร็จในปีนี้

คริสมาสต์เป็นช่วงเวลาที่ให้ผลผลิตอย่างมากของปีโดยเฉพาะอย่างยิ่งสำหรับการขายของเขา ฮิลแบร์ตรู้ดีว่ามันทำงานอย่างไร: คนเข้ามาในร้านและซื้อของขวัญชิ้นแรกที่พวกเขาเสนอ พวกเขาจ่ายเงินและวิ่งไปที่ร้านอื่น ในทางปฏิบัติสิ่งที่เป็นจริงของขวัญไม่ได้สร้างความแตกต่าง ราคายังไม่เกี่ยวข้องด้วยหากไม่สูงเกินไป ทุกอย่างขึ้นอยู่กับเวลาที่เหลือจนถึงวันคริสต์มาส - เวลาที่สั้นกว่ายิ่งลูกค้าสำนึกผิดมากเท่าไหร่ราคาก็เต็มใจจ่ายมากขึ้นเท่านั้น

สิ่งที่ต้องทำสำหรับฮิลแบร์ตก็คือดูนาฬิกาของเขา - และเขารู้ทันทีว่าลูกค้าของเขาสามารถใช้จ่ายได้เท่าใด เขาสามารถใช้ประโยชน์จากความจริงข้อนี้ได้อย่างง่ายดายเขาเพียงแค่หาของกำนัลที่แพงที่สุดที่เขาสามารถขายให้กับลูกค้าคนหนึ่งและมอบให้กับพวกเขา ตอนนี้เขารู้แล้วว่าเขาลืมที่จะใช้กลยุทธ์อันชาญฉลาดนี้เมื่อปีที่แล้ว ที่จะเปลี่ยนแม้ว่า!

อย่างไรก็ตามฮิลแบร์ตต้องการทราบว่าธุรกิจของเขาจะรุ่งเรืองเพียงใดหากเขาใช้รูปแบบที่ยิ่งใหญ่ของเขา เขาสามารถรวบรวมรายชื่อผู้คนที่มาที่ร้านค้าของเขาได้ แต่เขาไม่แน่ใจว่าเขาสามารถทำเงินได้มากแค่ไหน

งานของคุณ (TL; DR)

ข้อมูลที่ป้อนประกอบด้วยรายการของของขวัญที่มีราคาจากน้อยไปหามากและรายการงบประมาณของลูกค้า รายการงบประมาณอยู่ในลำดับเดียวกับที่ลูกค้ามาถึงร้านค้าโดยมีเงื่อนไขว่าลูกค้าทุกคนยินดีที่จะจ่ายอย่างน้อยเท่า ๆ กับรายการก่อนหน้าซึ่งหมายความว่ามันขึ้นไป

สำหรับลูกค้าแต่ละรายให้หาของกำนัลที่แพงที่สุดที่พวกเขาเต็มใจจ่ายและส่งออกราคาของมัน 0หากไม่มีของขวัญภายในงบประมาณที่มีการส่งออก

คุณจะได้รับ-40%โบนัสตัวละครหากความซับซ้อนของเวลาแบบอะซิมโทติคของอัลกอริทึมของคุณคือO(n+m)(แทนที่จะเป็นเรื่องเล็กน้อยO(n*m)) ความยาวของรายการอินพุตอยู่ที่ไหนn, m

นี่คือไบต์ที่สั้นที่สุดชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

ตัวอย่าง

การป้อนข้อมูล:

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

งานนี้นำมาจากการแข่งขันเขียนโปรแกรมท้องถิ่นและแปลเป็นภาษาอังกฤษโดยฉัน นี่คือการมอบหมายดั้งเดิม: https://www.ksp.sk/ulohy/zadania/1131/


9
โบนัสเป็นสิ่งหนึ่งที่จะหลีกเลี่ยงเมื่อเขียนความท้าทาย อย่างไรก็ตามฉันคิดว่ามันอาจจะดีที่นี่ หากคุณต้องการเก็บไว้ฉันแนะนำให้เปลี่ยนเป็นโบนัสตามเปอร์เซ็นต์ โบนัส 20 ตัวอักษรไม่ได้มีความหมายอะไรกับการส่งจาวา แต่โดยพื้นฐานแล้วจำเป็นสำหรับการแก้ปัญหาในภาษากอล์ฟ
เดนเกอร์

ฉันสามารถมอบรางวัลให้ OP ให้กับ backstory เพียงอย่างเดียวได้หรือไม่? สุจริตนั่นทำให้ฉันยิ้มได้ ทุกความท้าทายต้องการหนึ่งในนั้น
แมว

@tac ขอบคุณ แต่ตามที่ระบุไว้ในข้อความเล็ก ๆ ที่ด้านล่างฉันไม่ได้ทำขึ้น backstory - ฉันแปลมันเท่านั้น
sammko

@sammko ใช่ฉันเห็นว่า แต่ความคิดเห็นข้างต้นของฉันยังคงมีอยู่ :)
แมว

คำตอบ:


5

Pyth, 17 16 ไบต์

1 ไบต์ขอบคุณ Pietu1998

VE=.-Q]
e|fgNTQ0

สาธิต

คำอธิบาย:

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.

ฉันคิดว่าคุณสามารถบันทึก 1 ไบต์กับVE=.-Q]\ e|fgNTQ0n โดยพื้นฐานแล้วมีสิ่งเดียวกัน แต่มีลูป
PurkkaKoodari

4

Haskell, 67 ไบต์

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

ตัวอย่างการใช้งาน: ->[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]

แยกราคาในสองส่วน(h,t)ที่hมีทุกราคา <= งบประมาณของลูกค้าต่อไปและtทุกคนที่คนอื่น ๆ ใช้ราคาสุดท้ายของhและดำเนินการต่อทั้งหมดซ้ำยกเว้นยอดhบวกสุดท้ายtและงบประมาณที่เหลืออยู่last(0:h)ประเมิน0ว่าหากhว่างเปล่า ที่คล้ายกัน: init (h++[0|h==[]]) ++ tเพิ่มองค์ประกอบดัมมี่0เป็นhถ้าhว่างเปล่าเพื่อให้initมีบางสิ่งที่จะปล่อย ( initล้มเหลวในรายการว่าง)


3

Java, 154 * 0.6 = 92.4 ไบต์

-13 ไบต์เนื่องจากแลมบ์ดาสามารถใช้งานได้จริง int[]ไม่ใช่Integer[](ขอบคุณBunjiquoBianco )

สิ่งนี้ควรใช้เวลา O (n + m) และพื้นที่เพิ่มเติม O (n + m) (สมมติว่าผมเข้าใจโน้ต O ใหญ่)

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;}

เยื้อง: (ลองออนไลน์! )

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

ฉันแสดงส่วนขยายที่ไม่ใช่แลมบ์ดาที่นี่เพราะการประกาศประเภทนั้นสะอาดกว่าและเป็นตรรกะเดียวกันทั้งหมด แลมบ์ดาปรากฏอยู่ที่ลิงค์ ideone

คำอธิบาย:

ตัวแปรที่ใช้:

  • g คือรายการราคาของขวัญ bเป็นรายการของงบประมาณ
  • glคือความยาวของgและblbคือความยาวของ
  • a เป็นกองสำหรับของขวัญราคาไม่แพง sเป็นอาร์เรย์ผลลัพธ์ของของขวัญที่ขายแล้ว
  • gp, bpและapเป็นตัวชี้สำหรับg, bและaตามลำดับ นอกจากนี้ยังเป็นตัวชี้สำหรับbps

ขั้นตอนวิธีการ:

  • สำหรับแต่ละงบประมาณตามความยาวของงบประมาณ
    • ในขณะที่งบประมาณนี้สามารถซื้อของขวัญได้ที่ g[gp]
      • ผลักงบประมาณลงบนสแต็กaและเพิ่มขึ้นgp
    • Pop ด้านบนของaลงไปถ้ามันมีอยู่แล้วอย่างอื่นใส่s[bp]0

คุณไม่สามารถแกงแลมบ์ดาได้หรือ (เช่น(g,b)->การg->b->?
ASCII เท่านั้น

@somebody เห็นได้ชัดว่าใช่ ด้วยเหตุผลบางอย่างมันไม่เคยทำงานให้ฉันมาก่อน แต่ตอนนี้มันจะ 0.o (คุณบันทึก 0.6 ไบต์หลังจากโบนัส)
CAD97

คุณสามารถบันทึกบางไบต์ได้ด้วยการใช้ longs หากอินพุตนั้นถือว่ายาว [] (พาคุณไปที่ 158bytes) - ideone.com/invHlc
BunjiquoBianco

1
@BunjiquoBianco จริงๆแล้วฉันสามารถใช้ int [] ด้วยเหตุผลบางอย่างฉันอยู่ภายใต้การแสดงผลที่เนื่องจากอาร์กิวเมนต์ประเภทใช้ประเภทการอ้างอิง (ดังนั้นไม่ใช่แบบดั้งเดิมที่มีค่าที่พิมพ์int) ที่ฉันต้องใช้อาร์เรย์ประเภทการอ้างอิง แต่ฉันสามารถใช้อาร์เรย์ int ได้ดี ฉันจะอัปเดตเมื่อฉันมีโอกาส
CAD97

@ CAD97 Ha! ไม่สามารถเชื่อว่าฉันไม่ได้ทำให้การเชื่อมโยงที่ ...
BunjiquoBianco

2

Haskell, 87 * 0.6 = 52.2 ไบต์

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[]

แตกต่างอย่างสิ้นเชิงกับคำตอบอื่น ๆของฉันเพราะฉันจะได้รับโบนัส

บรรทัดสุดท้าย (-> g[]) ไม่ได้เป็นส่วนหนึ่งของคำจำกัดความ แต่เรียกค่าใช้จ่าย ตัวอย่างการใช้: 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] ->

ทำงานโดยทั่วไปเช่นเดียวกับคำตอบของ @ CAD97เช่นใช้ตัวช่วย (ว่างเปล่า) เพื่อติดตามรายการที่ซื้อได้ รายละเอียด: เช็คอินตามลำดับ:

  • หากราคาแรกน้อยกว่าหรือเท่ากับงบประมาณแรกให้ย้ายราคาไปยังสแต็ก เรียกอีกครั้ง.
  • หากสแต็กว่างเปล่าส่งคืน 0 ตามด้วยการเรียกซ้ำโดยที่งบประมาณลดลง
  • หากทั้งสแต็คและรายการงบประมาณไม่ว่างให้ส่งกลับด้านบนสุดของสแต็กตามด้วยการเรียกซ้ำด้วยสแต็กและงบประมาณที่ผุด
  • มิฉะนั้นจะส่งคืนรายการเปล่า

สิ่งนี้ทำงานได้m+nทันเวลาเนื่องจาก a) การดำเนินการในตัวช่วยสแต็กใช้เวลาคงที่และ b) ในการเรียกแบบเรียกซ้ำแต่ละรายการหนึ่งรายการจะถูกทำให้สั้นลง


2

เยลลี่ 15 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

ṀṄ;©®œ^  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 ไบต์

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)]:[]

โคลนอีกคำตอบของ @ CAD97

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.