คุณสามารถทำพายผลไม้สามลูกได้กี่ก้อน


32

พายสามผลไม้ทำจากผลไม้สามแบบ พายสามผลไม้ที่คุณสามารถทำได้มากที่สุดจากปริมาณผลไม้ 5 ชนิดที่คุณมีคืออะไร

ตัวอย่างเช่นด้วย

1 apple
1 banana
4 mangoes 
2 nectarines
0 peaches

คุณสามารถทำ 2 พาย:

apple, mango, nectarine
banana, mango, nectarine

อินพุต:ห้าจำนวนเต็มที่ไม่เป็นลบหรือรายการของพวกเขา

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

กรณีทดสอบ:

1 1 4 2 0
2
2 2 2 2 2
3
0 6 0 6 0
0
12 5 3 2 1
5
1 14 14 3 2
6
0 0 1 0 50
0

ลีดเดอร์บอร์ด:


ฉันเชื่อว่าตัวอย่างของคุณไม่มีสองตัวเลือกเพิ่มเติม: Apple, Banana, Mango และ Apple, Banana, Nectarine ดังนั้น1 1 4 2 0กรณีทดสอบควรสร้างผลลัพธ์: 4.
cobaltduck

@cobaltduck แต่ถ้าคุณใช้ Apple และ Banana ในวงกลมแรกของคุณ (Apple / Banana / Mango) คุณไม่มี Apple หรือ Banana ที่จะใช้ในวงกลมที่สองของคุณ (Apple / Banana / Nectarine)
AdmBorkBork

2
@ Timmy D: อ่าเข้าใจแล้ว ไม่ชัดเจนว่าพายถูกสร้างขึ้นพร้อมกัน
cobaltduck

@cobaltduck ฉันเชื่อว่าพวกเขาไม่ต้องทำพร้อมกัน แต่คุณไม่สามารถโกงได้โดยการนำผลไม้ที่คุณใช้สำหรับผลแรกมาใช้ซ้ำ
นาย Lister

@นาย. Lister: ความหมาย มันเพียงพอแล้วที่มีกฎที่คลุมเครือ (สำหรับผู้อ่านอย่างน้อยหนึ่งคน) และได้รับการชี้แจง
cobaltduck

คำตอบ:


34

Pyth, 19 18 14 ไบต์

-1 ไบต์โดย @FryAmTheEggman

โปรแกรม 14 ไบต์โดย @isaacg

ฉันอ้างว่าจำนวนของพายที่สามารถเกิดขึ้นได้จากรายการจากน้อยไปมาก[x1,x2,x3,x4,x5]คือ:

floor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))

หรือในรหัส:

JSQhS/Ls~PJ_S3

[ดูประวัติการแก้ไขสำหรับโปรแกรม TI-BASIC และ APL]

พิสูจน์ความถูกต้อง

ปล่อย

s3 = x1+x2+x3
s4 = x1+x2+x3+x4
s5 = x1+x2+x3+x4+x5

เราต้องการแสดงให้เห็นว่าP(X)=floor(min(s5/3,s4/2,s3))เป็นจำนวนที่มากที่สุดของพายสำหรับรายการx1≤x2≤x3≤x4≤x5ของจำนวนผลไม้ 1 ~ 5

ก่อนอื่นเราแสดงให้เห็นว่าตัวเลขทั้งสามนั้นเป็นขอบเขตบน

  • เนื่องจากมีs5ผลไม้ทั้งหมดและแต่ละพายมีสามผลไม้⌊s5/3⌋จึงมีขอบเขตบน

  • เนื่องจากมีs4ผลไม้ที่ไม่ใช่ผลไม้ 5 และอย่างน้อยสองผลไม้ที่ไม่ใช่ 5 จะต้องในแต่ละพาย⌊s4/2⌋เป็นขอบเขตบน

  • เนื่องจากมีs3ผลไม้ที่ไม่ใช่ผลไม้ 4 หรือผลไม้ 5 และอย่างน้อยหนึ่งผลไม้ดังกล่าวเป็นสิ่งจำเป็นในแต่ละพายs3เป็นขอบเขตบน

ประการที่สองเราแสดงให้เห็นว่าวิธีการเก็บผลไม้จากกองขนาดใหญ่ทั้งสามนั้นเป็นที่น่าพอใจเสมอ เราทำสิ่งนี้โดยอุปนัย

กรณีฐาน: 0 พายสามารถเห็นได้ชัดว่าเกิดขึ้นจากรายชื่อที่ถูกต้องใด ๆ P(X)>=0กับ

ขั้นตอนอุปนัย:ได้รับรายชื่อใด ๆXที่P(X) > 0เราสามารถอบพายหนึ่งทิ้งไว้ข้างหลังรายการด้วยX' P(X') >= P(X)-1เราทำเช่นนี้โดยการใช้ผลไม้ที่ใหญ่ที่สุดจากสามกอง3,4,5แล้ว resorting ถ้าจำเป็น อดทนกับฉัน มีบางงาน

  • ถ้าเป็นx2<x3เช่นนั้นเราไม่จำเป็นต้องเรียงลำดับรายการหลังจากลบผลไม้ออก เรามีข้อมูลที่ถูกต้องX'อยู่แล้ว เรารู้ว่าP(X') = P(X)-1เพราะs5'น้อยกว่า 3 (เพราะผลไม้ชนิดที่ 1 ~ 5 ถูกลบออก 3) s4'คือ 2 น้อยกว่าและs3'1 น้อยกว่า ดังนั้นP(X')เป็นสิ่งหนึ่งน้อยกว่า P (X)
  • ถ้าx3<x4เช่นนั้นเราก็ทำเช่นเดียวกัน
  • x2=x3=x4ตอนนี้เราจะใช้กรณีที่ เราจะต้องจัดรายการใหม่ในเวลานี้

    • หากx5>x4แล้วเราจัดเรียงรายการโดยการเปลี่ยนกอง 4 และ 2 s5'และs4'ยังคงลดลง 3 และ 2 ตามลำดับ s3'=s3-2แต่ นี้ไม่ได้เป็นปัญหาเพราะถ้าx2=x3=x4แล้ว2*x4<=s3-> ->2*x4+s3 <= 2*s3 (x4 + s4)/2 <= s3เรามีสองหน่วยย่อย:
    • ความเท่าเทียมกันคือ(x4,x3,x2,x1)=(1,1,1,0)ในกรณีที่P(X)= 1และเราสามารถสร้างพายจากกองได้อย่างชัดเจน5,4,3หรือ:

    • (s4+1)/2 <= s3ซึ่งในกรณีที่การลดลงs4เป็นพิเศษ1ไม่ได้หมายความว่าการลดลงของ P (X) เป็นพิเศษ

  • x1<x2=x3=x4=x5ตอนนี้เรากำลังทิ้งให้อยู่กับกรณีที่ ตอนนี้s3ก็จะลดลง 1, ดังนั้นเราต้อง(s5/3+1)เป็น<=s4/2; ที่เป็นหรือ8x5+2x1+2<=9x5+3x1 x5+x1>=2ทุกกรณีที่เล็กกว่านี้สามารถตรวจสอบได้ด้วยตนเอง

  • หากทุกหมายเลขเท่ากันเป็นที่ชัดเจนว่าเราสามารถบรรลุขอบเขต⌊s5/3⌋ซึ่งน้อยกว่าอีกสองเสมอ - เราเพียงแค่ผ่านตัวเลขในลำดับ

ในที่สุดเราก็ทำเสร็จแล้ว โปรดแสดงความคิดเห็นถ้าฉันขาดอะไรบางอย่างและฉันจะให้รางวัลเล็ก ๆ สำหรับการพิสูจน์ที่สง่างามมากขึ้น


ฉันคิดว่าการอ้างสิทธิ์ของคุณตรงกับคำตอบซ้ำของ @ fryamtheeggman
Sparr

@ Sparr ฉันพยายามพิสูจน์ขอบเขตของฉันสามารถเข้าถึงได้โดยใช้วิธีของ fryamtheeggman
lirtosiast

2
นี้สามารถ golfed โดย 4 bytes โดยเปลี่ยนเป็นวง:JSQhS/Ls~PJ_S3
isaacg

3
ฉันเชื่อว่าฉันได้พบหลักฐานสำหรับnส่วนผสมและkส่วนผสมต่อพาย แต่มันยาวเกินไปสำหรับกล่องความคิดเห็นนี้ โปรดระบุข้อผิดพลาดที่คุณอาจพบเพื่อให้เราได้รับการพิสูจน์แล้ว
Mego

7

CJam, 34

q~L{J2be!\f{\.-_W#){j)7}|;}0+:e>}j

ลองออนไลน์

คำอธิบาย:

q~          read and evaluate the input array
L{…}j       calculate with memoized recursion and no initial values
             using the input array as the argument
  J2b       convert 19 to base 2 (J=19), obtaining [1 0 0 1 1]
  e!        get permutations without duplicates
             these are all the combinations of three 1's and two 0's
             which represent the choices of fruit for one pie
  \         swap with the argument array
  f{…}      for each combination and the argument
    \       swap to bring the combination to the top
    .-      subtract from the argument array, item by item
    _       duplicate the resulting array
    W#)     does it contain the value -1? (calculate (index of W=-1) + 1)
    {…}|    if not
      j     recursively solve the problem for this array
      )7    increment the result, then push a dummy value
    ;       pop the last value (array containing -1 or dummy value)
  0+        add a 0 in case the resulting array is empty
             (if we couldn't make any pie from the argument)
  :e>       get the maximum value (best number of pies)

บันทึกค่าใช้จ่ายในการเรียกใช้ซ้ำเป็นไบต์หรือไม่ ไม่มีการ จำกัด เวลาทำงาน
xnor

2
@xnor ฉันคิดว่ามันจริงจะช่วยประหยัด 1 ไบต์ที่นี่ :)
aditsu

7

Haskell, 62 ไบต์

f x=maximum$0:[1+f y|y<-mapM(\a->a:[a-1|a>0])x,sum y==sum x-3]

ฟังก์ชันนี้กำหนดฟังก์ชันfที่ใช้ในรายการผลไม้xและส่งคืนจำนวนสูงสุดของพาย

คำอธิบาย

เราคำนวณจำนวนของพายซ้ำ ส่วนที่mapM(\a->a:[a-1|a>0])xประเมินไปยังรายการของรายการทั้งหมดที่ได้รับจากการxลดรายการเชิงบวกใด ๆ ถ้าx = [0,1,2]มันส่งผลให้

[[0,1,2],[0,1,1],[0,0,2],[0,0,1]]

ส่วนระหว่างด้านนอก[]คือความเข้าใจในรายการ: เราวนซ้ำทั้งหมดyในรายการด้านบนและกรองผู้ที่ผลรวมไม่เท่ากับsum(x)-3ดังนั้นเราจึงได้รายการทั้งหมดที่มี 3 ผลไม้ต่าง ๆ ลงในวงกลม จากนั้นเราจะประเมินfรายการเหล่านี้ซ้ำๆ เพิ่ม1ไปยังแต่ละรายการและใช้ประโยชน์สูงสุดของรายการเหล่านั้นและ0(กรณีพื้นฐานหากเราไม่สามารถทำพายได้)


7

C #, 67

ทำซ้ำหนึ่งวงกลมต่อการทำซ้ำด้วยผลไม้ที่คุณมีมากที่สุดจนกว่าคุณจะหมด

int f(List<int>p){p.Sort();p[3]--;p[4]--;return p[2]-->0?1+f(p):0;}

กรณีทดสอบที่นี่


ไม่คุ้นเคยกับ C # แต่คุณสามารถทำp[2]--ในเวลาเดียวกันกับการตรวจสอบได้p[2]>-1หรือไม่
xnor

จุดดีฉันจะอัปเดตคำตอบในไม่กี่วินาที
AXMIM

6

Pyth, 29

Wtt=QS-Q0=Q+tPPQtM>3.<Q1=hZ;Z

ชุดทดสอบ

เรียงลำดับรายการอินพุตและลบศูนย์ จากนั้นตราบใดที่คุณมีผลไม้ 3 ชิ้นให้ลดองค์ประกอบแรกและสองสุดท้ายแล้วเพิ่มองค์ประกอบที่เหลือลงในรายการก่อนที่จะเรียงลำดับและลบศูนย์อีกครั้ง จากนั้นเพิ่มตัวนับ 1

อันที่จริงแล้วค่อนข้างเร็วตราบเท่าที่มีเพียง 5 ผลไม้ก็สามารถแก้ปัญหาสำหรับถังขยะผลไม้ที่มีขนาดใหญ่มากเช่น1000,1000,1000,1000,1000ภายในไม่กี่วินาที


คุณพิสูจน์ได้ไหมว่าถูกต้อง?
aditsu

@aditsu ฉันยังไม่ได้พิสูจน์ แต่ฉันตรวจสอบกับคุณแล้วสำหรับค่าเพิ่มเติมหลายอย่าง ฉันไม่ได้เขียนหลักฐานอะไรแบบนี้มาก่อน แต่ฉันจะพยายาม สำหรับตอนนี้ฉันจะบอกว่ามันสมเหตุสมผลแล้วที่จะใช้งานได้เพราะคุณมักจะเก็บผลไม้จากกองผลไม้ที่ใหญ่ที่สุดเท่านั้นจนกว่าคุณจะได้ชิ้นเล็ก ๆ แม้ว่ากลวิธีโลภจะไม่ถูกต้องโดยเนื้อแท้ แต่ฉันไม่สามารถคิดได้ว่าทำไมมันถึงไม่ทำงานที่นี่
FryAmTheEggman

@FryAmTheEggman ฉันเข้าใจถูกต้องหรือไม่ว่าคุณรับผลไม้ที่พบมากที่สุดสองอย่างและผลไม้ที่หายากที่สุด?
xnor

@xnor ใช่ถูกต้องแล้ว มันใช้ไม่ได้เหรอ?
FryAmTheEggman

1
@ TimmyD ไม่ฉันไม่ (คิดว่าฉัน) ต้องทำ แต่จะไม่เสียค่าใช้จ่ายใด ๆ ในการลบฟังก์ชันนี้ (จริง ๆ แล้วมีค่าใช้จ่ายมากกว่า) ที่กล่าวว่าฉันคาดว่าทางออกของ Reto Koradiจะสั้นกว่าในภาษาส่วนใหญ่และเห็นได้ชัดว่าโทมัสมีความรัดกุมมากขึ้น ฉันคิดว่าเหตุผลที่คุณไม่ต้องจัดเรียงใหม่เกี่ยวข้องกับมันไม่สำคัญว่าคุณจะเลือกกองขนาดเล็ก 3 กองจากที่ใด
FryAmTheEggman

6

Python โซลูชันทั่วไป128 92 ไบต์

-36 ไบต์จาก @xnor คุณจริง mvp

g=lambda l,k:0if k>sum(l)else-(-1in l)or-~g(map(sum,zip(sorted(l),[0]*(len(l)-k)+[-1]*k)),k))

def g(a,k):b=[i for i in a if i];return 0if len(b)<k;c=sorted(b,reverse=True);return 1+g([c[i]-(k-1>i)for i in range(len(c))],k)

มันใช้งานได้ตราบใดที่หลักฐานของฉันถูกต้อง หากไม่ใช่ให้ฉันรู้ว่าทำไมฉันจึงสามารถลองแก้ไขได้ ถ้ามันเข้าใจไม่ได้ให้ฉันรู้และฉันจะโจมตีมันหลังจากกาแฟสักสองสามแก้ว


ตอนนี้ทุกอย่างดูเหมือนจะแน่นสำหรับฉัน
lirtosiast

@Mego ขอบคุณสำหรับการทำงานกับสิ่งนี้! คุณช่วยรวมหลักฐานไว้ในโพสต์ SE ได้ไหม? มีความกังวลโดยทั่วไปว่ามีคนอ่านหลายปีต่อมาอาจพบลิงค์ที่ตาย การจัดรูปแบบ LaTeX ส่วนใหญ่ควรทำงานใน MathJax
xnor

@ เช่นโอ๊ะโอฉันลืมไปว่า MathJax ไม่ได้เปิดใช้ที่นี่ อืมฉันจะถามว่าจะทำอย่างไร
xnor

ฉันกำลังตัดสินรางวัลสำหรับหลักฐานนี้ ยินดีด้วย!
xnor

@Mego Nope ฉันคิดว่าลิงก์ MathCloud ของคุณดีที่สุดที่เรามี
xnor

5

Python 2, 78 ไบต์

รับหมายเลข 5 เป็นอินพุต: 91 89 88 ไบต์

s=sorted([input()for x in[0]*5])
while s[2]:s[2]-=1;s[3]-=1;s[4]-=1;s.sort();x+=1
print x

แก้ไข : เปลี่ยนs=sorted([input()for x in[0]*5])โดยs=sorted(map(input,['']*5));x=0บันทึก 1 ไบต์

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

ขอบคุณ @ThomasKwa และ @xsot สำหรับคำแนะนำของคุณ

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

 s=sorted([input()for x in[0]*5]) takes 5 numbers as input, puts them in a list 
                                  and sorts it in ascending order. The result
                                  is then stored in s 

 while s[2]:                      While there are more than 3 types of fruit 
                                  we can still make pies. As the list is                     
                                  sorted this will not be true when s[2] is 0. 
                                  This takes advantage of 0 being equivalent to False.

 s[2]-=1;s[3]-=1;s[4]-=1          Decrement in one unit the types of fruit 
                                  that we have the most

 s.sort()                         Sort the resulting list

 x+=1                             Add one to the pie counter

 print x                          Print the result

โปรดทราบว่าตัวแปรxนั้นไม่เคยถูกกำหนด แต่โปรแกรมใช้ประโยชน์จากการรั่วไหลของ python 2.7 บางตัว เมื่อกำหนดรายการsด้วย list comprehension ค่าสุดท้ายใน iterable ( [0]*5ในกรณีนี้) จะถูกเก็บไว้ในตัวแปรที่ใช้เพื่อวนซ้ำ

วิธีทำให้ชัดเจนยิ่งขึ้น:

>>>[x for x in range(10)]
>>>x
9

กำลังบันทึกรายการเป็นอินพุต: 78 ไบต์

ขอบคุณ @xnor @xsot และ @ThomasKwa ที่แนะนำให้เปลี่ยนอินพุตเป็นรายการ

s=sorted(input());x=0
while s[2]:s[2]-=1;s[3]-=1;s[4]-=1;s.sort();x+=1
print x

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

มันทำงานในลักษณะเดียวกับโค้ดด้านบน แต่ในกรณีนี้อินพุตนั้นเป็นรายการอยู่แล้วดังนั้นจึงไม่จำเป็นต้องสร้างมันและตัวแปรxจะต้องถูกกำหนดไว้

ข้อสงวนสิทธิ์: นี่เป็นความพยายามครั้งแรกของฉันในการเล่นกอล์ฟและรู้สึกว่ายังสามารถเล่นกอล์ฟได้ดังนั้นแนะนำการเปลี่ยนแปลงใด ๆ ที่อาจทำเพื่อลดจำนวนไบต์


1
คุณได้รับอนุญาตให้มีการป้อนข้อมูลอยู่แล้วในรายการ s[2]>0-> s[2]เนื่องจากจำนวนในกองไม่ติดลบเสมอ
lirtosiast

โทมัส Kwa s=sorted(input())ชี้ให้เห็นว่าคุณอาจถือว่าการป้อนข้อมูลที่จะได้รับอยู่แล้วเป็นรายการดังนั้นคุณก็สามารถทำได้ นอกจากนี้จำนวนไบต์ปัจจุบันของคุณคือ 89 ขึ้นบรรทัดใหม่นับเป็นอักขระตัวเดียว
xnor

@ThomasKwa แล้วชี้ให้เห็นว่าคุณสามารถที่จะยอมรับการป้อนข้อมูลที่เป็นรายการ s=sorted(map(input,['']*5));x=0แต่ถ้าคุณยืนยันในการรับข้อมูลหลายสายให้เปลี่ยนบรรทัดแรกมีดังต่อไปเพื่อประหยัดไบต์:
xsot

4

CJam, 23 ไบต์

0l~{\)\$2/~+:(+_2=)}g;(

ลองออนไลน์

การทำเช่นนี้ใช้ผลไม้จาก 3 กองที่ใหญ่ที่สุดในการทำซ้ำแต่ละครั้งและนับจำนวนการทำซ้ำ

ฉันไม่มีหลักฐานทางคณิตศาสตร์ว่าสิ่งนี้จะให้ผลลัพธ์ที่ถูกต้องเสมอ มันใช้สำหรับตัวอย่างการทดสอบที่ให้มาและฉันจะเชื่อว่ามันใช้ได้กับทุกกรณีจนกว่าจะมีคนให้ตัวอย่างที่เคาน์เตอร์กับฉัน

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

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

ฉันมีเหตุผลที่เป็นทางการเล็กน้อยในหัวของฉัน ฉันจะลองคิดหาวิธีที่จะใส่ลงในคำ / สูตร


ฉันพยายามใช้การเหนี่ยวนำ; บางทีเราอาจรวมแนวคิดของเราเพื่อหาข้อพิสูจน์ที่เป็นทางการ
lirtosiast

@ThomasKwa ฉันยังไม่ได้คิดอะไรที่ชัดเจนเพียงพอที่จะฟังดูน่าเชื่อถือถ้าฉันเขียนมันลงไป ทุกอย่างลงมาจากความจริงที่ว่าฉันไม่เห็นเหตุผลเลยว่าทำไมมันจะดีกว่าถ้าจะเอาสแต็กขนาดเล็กมาวางสแต็กขนาดใหญ่ ในขณะที่มีสถานการณ์ที่ชัดเจนซึ่งการถ่ายภาพจากสแต็กขนาดเล็กจะแย่ลง ฉันยังป้อนตัวเลขสุ่มขนาดใหญ่พอสมควรทั้งในโซลูชันของฉันและของ aditsu และพวกเขาก็ให้ผลลัพธ์เหมือนกัน โซลูชันของฉันสอดคล้องกับสูตรของคุณสำหรับตัวอย่างที่ฉันลอง
Reto Koradi

3

> <>, 76 ไบต์

0&4\/~}&?!/
@:@<\!?:}$-1@@$!?&+&:)@:@
,:&:@(?$n;/++:&+::2%-2,:&:@(?$&~+:3%-3

เปลี่ยนการเรียงลำดับใน> <> ไม่ใช่เรื่องง่าย! โปรแกรมนี้อาศัยหลักฐานที่นำโดย Thomas Kwa ว่าเป็นความจริงซึ่งแน่นอนว่าเป็นกรณีของกรณีทดสอบ

คาดว่าจะมีหมายเลขอินพุททั้ง 5 หมายเลขในสแต็กเมื่อเริ่มต้นโปรแกรม

สองบรรทัดแรกเรียงลำดับหมายเลขบนสแต็กและบรรทัดที่สามทำการคำนวณfloor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))จากคำตอบของโทมัส


มันจะสั้นลงหรือไม่ถ้าคุณคำนวณผลรวมทั้งหมดขององค์ประกอบสาม / สี่และจำนวนนาทีของทั้งหมด?
lirtosiast

@ThomasKwa ฉันดูเหมือนว่าจะเกี่ยวข้องกับการหาวิธีเรียงสับเปลี่ยนของชุดอินพุตโดยรวมองค์ประกอบระดับสูงสุด 3 และ 4 ของแต่ละรายการและใช้ขนาดเล็กที่สุด? ฉันไม่คิดว่าการหาวิธีเรียงสับเปลี่ยนจะสั้นกว่าวิธีเรียงลำดับ / คำนวณที่ฉันเคยใช้โดยเฉพาะในภาษาสแต็ก หากรู้ว่าอัลกอริทึมที่มีประโยชน์สำหรับการสร้างการเรียงสับเปลี่ยนในภาษาแบบสแต็กฉันจะสนใจดู: o)
Sok

2

Python 2, 59 ไบต์

h=lambda l,k=3:k*'_'and min(h(sorted(l)[:-1],k-1),sum(l)/k)

วิธีการทั่วไปที่ทำงานสำหรับการใด ๆและn kk=3ทำให้ผลไม้ต่อเริ่มต้นพาย 3 แต่คุณสามารถส่งผ่านค่าที่แตกต่างกัน การเรียกซ้ำใช้ความจริงที่ว่าสตริงมีขนาดใหญ่กว่าตัวเลขใน Python 2 โดยปล่อยให้สตริงว่างแสดงถึงกรณีฐานของอินฟินิตี้

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


การพิสูจน์ของ Megoทำให้ฉันคิดว่าการพิสูจน์โดยตรงมากขึ้นว่าการทานผลไม้ที่พบบ่อยที่สุดนั้นดีที่สุด นี่คือที่ระบุด้วยพายkผลไม้

ทฤษฎีบท:การทานkผลไม้ที่พบบ่อยที่สุดซ้ำแล้วซ้ำอีกให้จำนวนที่เหมาะสมของพาย

หลักฐาน:เราจะแสดงให้เห็นว่าถ้าNเป็นไปได้พายแล้วกลยุทธ์ที่พบบ่อยที่สุดผลไม้ผลิตอย่างน้อยNพาย เราทำสิ่งนี้โดยการสลับผลไม้ระหว่างNพายเพื่อให้ตรงกับที่ผลิตโดยกลยุทธ์นี้ในขณะที่รักษาพายให้ใช้ได้

ลองทำดูเพื่อให้วงกลมแรก (เรียกว่าp) มีผลไม้ที่พบมากที่สุด ถ้ามันไม่ได้ยังจะต้องมีผลไม้แต่ไม่เป็นผลไม้กันมากขึ้นi jจากนั้นพายที่เหลือต้องเคร่งครัดมากขึ้นของผลไม้jกว่าผลไม้iและอื่น ๆ บางพายอื่น ๆqจะต้องมีแต่ไม่j iจากนั้นเราสามารถสลับผลไม้iจากพายpกับผลไม้jจากพายqซึ่งทำให้Nพายมีผลไม้ที่แตกต่างกัน

ทำซ้ำขั้นตอนนี้จนกว่าจะpมีkผลไม้ที่พบมากที่สุด

จากนั้นตั้งค่าพายpกันแล้วทำซ้ำขั้นตอนนี้สำหรับพายถัดไปเพื่อให้มีผลไม้ที่เหลืออยู่มากที่สุด ทำต่อไปเรื่อย ๆ จนกว่าพายจะเป็นลำดับที่ผลิตโดย stategy ที่พบได้บ่อยที่สุด


1

PowerShell, 92 ไบต์

$a=($args|sort)-ne0;while($a.count-ge3){$a[0]--;$a[-1]--;$a[-2]--;$a=($a-ne0;$c++}($c,0)[!$c]

ใช้อัลกอริธึมแบบโลภที่เหมือนกันกับคำตอบของ FryAmTheEggman ... เพียงแค่ wordier มากมายใน PowerShell ....

$a=($args|sort)-ne0  # Take input arguments, sort them, remove any 0's
while($a.count-ge3){ # So long as we have 3 or more fruit piles
  $a[0]--            # Remove one from the first element...
  $a[-1]--           # ... the last element ...
  $a[-2]--           # ... and the second-to-last.
  $a=$a-ne0          # Remove any 0's from our piles
  $c++               # Increment how many pies we've made
}                    #
($c,0)[!$c]          # Equivalent to if($c){$c}else{0}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.