หอคอยที่สูงที่สุดจากชุดตัวเลข


20

แก้ไข:ปริศนาเงินรางวัลตอนท้ายของคำถาม

เมื่อกำหนดตัวเลข 1 หลักคุณควรกำหนดความสูงของหอคอยที่พวกเขาสามารถสร้างได้

ตัวเลขอาศัยอยู่บนระนาบแนวนอนที่มีระดับพื้นดินที่สามารถยืนได้ ไม่มีหลักใดที่จะสับสนกับตัวเลขหลายหลักดังนั้นพวกเขาจึงมีพื้นที่ว่างทั้งสองด้านเสมอ

4 2  1 9  6  8

ตัวเลขสามารถอยู่ด้านบนของอีกหนึ่ง:

2
6

หรือสามารถรองรับได้สองแนวทแยงมุมด้านล่าง:

 9
5 8

ด้านล่างหนึ่ง (s) ต้องรองรับน้ำหนักบนหนึ่งในการสนับสนุน (ถ้ามี) รวมทั้งน้ำหนักบนหนึ่งของซึ่งเป็นเสมอ 1 หากมีผู้สนับสนุนสองคนพวกเขาจะแบ่งน้ำหนักรวมของคนบนให้เท่ากัน (50% -50%)

น้ำหนักของตัวเลขทุกหลักคือ 1 โดยอิสระจากมูลค่าของมัน

หากหนึ่งหลักรองรับสองหลักจะต้องสามารถรองรับผลรวมของน้ำหนักที่สอดคล้องกัน ตัวเลขสามารถรองรับได้สูงสุดตามค่าตัวเลข

บางอาคารที่ถูกต้อง (มีความสูง4, 3และ5):

            0          
7           1
5    1     1 1         9 supports a total weight of 1.5 = (1+1/2)/2 + (1+1/2)/2
2   5 4    5 5        
3  5 9 5  5 6 3        6 supports a total weight of 3 =  1.5 + 1.5 = (2*1+(2*1/2))/2 + (2*1+(2*1/2))/2

หอคอยที่ไม่ถูกต้องบางส่วน:

1         5           The problems with the towers are (from left to right):
1  12    2 3     8      1 can't support 1+1; no space between 1 and 2;
1  5 6  1 1 1   9       1 can't support 1.5 = (1+1/2)/2 + (1+1/2)/2; 8 isn't properly supported (digits at both bottom diagonals or exactly below the 8)    

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่ให้รายการของตัวเลขเป็นเอาท์พุทอินพุตหรือส่งกลับความสูงของหอคอยที่สูงที่สุดที่สร้างได้โดยใช้บางส่วน (อาจทั้งหมด) ของหลักเหล่านั้น

อินพุต

  • รายการหมายเลขหลักเดียวที่ไม่เป็นลบพร้อมองค์ประกอบอย่างน้อยหนึ่งรายการ

เอาท์พุต

  • จำนวนเต็มบวกเดียวคือความสูงของหอคอยที่สร้างได้สูงสุด
  • โซลูชันของคุณต้องแก้กรณีทดสอบตัวอย่างใด ๆ ในคอมพิวเตอร์ของฉัน (ฉันจะทดสอบเฉพาะกรณีที่ปิดฉันมีพีซีที่ต่ำกว่าค่าเฉลี่ย)

ตัวอย่าง

การจัดรูปแบบอยู่Input list => Output numberกับหอคอยที่เป็นไปได้ในบรรทัดถัดไปซึ่งไม่ได้เป็นส่วนหนึ่งของการส่งออก

[0]  =>  1

0

[0, 1, 1, 1, 1, 1]  =>  3

  0
  1
 1 1

[1, 1, 1, 1, 1, 2, 2]  =>  4

   1
   1
  1 1
 1 2 2

[0, 0, 2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9

0
2
2
5
5
5
7
7
9

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]  =>  9

   1
   2
   2
   3
   4
   5
  3 3
 4 4 4
5 5 5 5

[0, 0, 0, 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  11

   0
   1
   2
   3
   4
   5
  3 3
  4 5
  5 5
 3 7 3
2 7 9 2

[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  12

 0
 1
 2
 3
 4
 5
 6
 7
4 5
6 7
8 8
9 9

[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]  =>  18

      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
     5 5
     6 6
     7 7
    4 8 4
   3 7 7 3
  2 6 8 6 2
 2 5 8 8 5 2
 3 9 9 9 9 3

นี่คือรหัสกอล์ฟดังนั้นรายการที่สั้นที่สุดชนะ

เงินรางวัล

ฉันจะมอบรางวัลชื่อเสียง 100 รางวัล (ไม่เกี่ยวข้องกับรางวัลที่ได้รับไปแล้ว) สำหรับการแก้ปัญหาแบบขยายด้านล่างในเวลาพหุนาม (ในเรื่องความยาวของรายการอินพุต) หรือพิสูจน์ว่ามันเป็นไปไม่ได้ รายละเอียดของปัญหาเพิ่มเติม:

  • ตัวเลขที่ป้อนอาจเป็นจำนวนเต็มใด ๆ ที่ไม่เป็นลบไม่ใช่แค่ตัวเลข
  • ตัวเลขหลายหลักจะเกิดขึ้นแทนหมายเลขเดียว
  • ตัวเลขหลายหลักสามารถรองรับตัวเลขได้เช่น24สามารถรองรับได้24

ข้อเสนอเงินรางวัลไม่มีวันหมดอายุ ฉันจะเพิ่มและให้รางวัลเงินรางวัลหากมีหลักฐานปรากฏขึ้น


1
คุณมีเงินเพียงพอสำหรับพีซีเครื่องใหม่หรือไม่? จากนั้นฉันก็มีทางออก: P
ThreeFx

1
3-2-5-7หอคอยของคุณทำให้ฉันงง คุณบอกว่า "คนที่อยู่ด้านล่างต้องรองรับน้ำหนักที่คนที่สูงกว่าสนับสนุน (ถ้ามี) รวมถึงน้ำหนักที่สูงกว่าซึ่งเป็น 1 เสมอ" ซึ่งขัดแย้งกับคุณว่าตัวเลขสามารถรองรับได้มากที่สุด 'ค่าตัวเลข' - หากน้ำหนักของแต่ละหลักเป็นหนึ่งแล้วจุดที่มีจำนวนแตกต่างกันคืออะไร
MI Wright

3
@MIWright หมายเลขบ่งบอกถึงน้ำหนักที่คุณสามารถวางซ้อนทับจำนวนนั้นได้ แต่น้ำหนักของตัวเลขนั้นจะเป็น 1 เสมอ
Martin Ender

@ MartinBüttner OH, duh ขอขอบคุณ.
MI Wright

ชื่อกล่าวถึงชุดของตัวเลข แต่การพิจารณาตัวอย่างดูเหมือนว่าคุณหมายถึงรายการ ชุดไม่สามารถมีรายการซ้ำได้
Grimmy

คำตอบ:


10

Python 2 - 326

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

def S(u,c=0,w=[]):
 for(s,e)in[(len(w),lambda w,i:w[i]),(len(w)+1,lambda w,i:.5*sum(([0]+w+[0])[i:i+2]))]:
    m=u[:];l=[-1]*s
    for n in u:
     for i in range(s):
        if 0>l[i]and n>=e(w,i):m.remove(n);l[i]=n;break
    if([]==l or-1in l)==0:
     for r in S(m,c+1,[1+e(w,i)for i in range(s)]):yield r
 yield c
print max(S(sorted(input())))

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