บทนำ
สมมติว่าคุณและเพื่อนกำลังเล่นเกม เพื่อนของคุณคิดถึงลำดับของn
บิตบางอย่างและงานของคุณคือการอนุมานลำดับโดยถามคำถาม อย่างไรก็ตามคำถามประเภทเดียวที่คุณได้รับอนุญาตให้ถามคือ "นานแค่ไหนที่การเรียงลำดับทั่วไปที่ยาวที่สุดของลำดับของคุณและS
" ซึ่งS
เป็นลำดับของบิตใด ๆ คำถามที่คุณต้องการน้อยลงเท่านั้น
งาน
งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็น input เป็นจำนวนเต็มบวกn
และลำดับไบนารีของความยาวR
n
ลำดับอาจเป็นอาร์เรย์ของจำนวนเต็มสตริงหรือประเภทอื่น ๆ ที่คุณต้องการ R
โปรแกรมของคุณจะส่งออกลำดับ
โปรแกรมของคุณไม่ได้รับอนุญาตให้เข้าถึงลำดับR
โดยตรง เพียงสิ่งที่จะได้รับอนุญาตให้ทำอย่างไรเพื่อR
ที่จะให้มันเป็น input เพื่อฟังก์ชั่นพร้อมกับลำดับไบนารีอื่นlen_lcs
S
ฟังก์ชั่นlen_lcs(R, S)
ส่งกลับความยาวของ subsequence ทั่วไปที่ยาวที่สุดของและR
S
ซึ่งหมายความว่าลำดับที่ยาวที่สุดของบิตซึ่งเกิดขึ้นเป็น (ไม่จำเป็นต้องต่อเนื่องกัน) subsequence ทั้งในและR
S
อินพุตlen_lcs
ที่อาจมีความยาวแตกต่างกัน โปรแกรมควรเรียกใช้ฟังก์ชันนี้R
และลำดับอื่น ๆ ตามจำนวนครั้งแล้วสร้างลำดับใหม่R
ตามข้อมูลนั้น
ตัวอย่าง
พิจารณาปัจจัยการผลิตและn = 4
R = "1010"
อันดับแรกเราอาจประเมินlen_lcs(R, "110")
ซึ่งจะช่วยให้3
เนื่องจาก"110"
เป็น subsequence ทั่วไปที่ยาวที่สุดของและ"1010"
"110"
จากนั้นเราก็รู้ว่าR
ได้มาจากการ"110"
แทรกตำแหน่งหนึ่งบิตในบางตำแหน่ง ต่อไปเราอาจลองlen_lcs(R, "0110")
ซึ่งผลตอบแทน3
ตั้งแต่ลำดับที่ยาวที่สุดร่วมกัน"110"
และ"010"
ดังนั้นจึง"0110"
ไม่ถูกต้อง จากนั้นเราก็พยายามซึ่งผลตอบแทนlen_lcs(R, "1010")
4
ตอนนี้เรารู้R == "1010"
แล้วดังนั้นเราสามารถกลับลำดับนั้นเป็นเอาต์พุตที่ถูกต้อง ต้องมีการโทรถึง 3 len_lcs
ครั้ง
กฎและการให้คะแนน
ในแหล่งเก็บข้อมูลนี้คุณจะพบไฟล์ที่เรียกว่าsubsequence_data.txt
มี 100 สุ่มลำดับไบนารีของความยาวระหว่าง 75 และ 124 พวกเขาถูกสร้างขึ้นโดยการสามลอยสุ่มระหว่าง 0 และ 1 ค่าเฉลี่ยของพวกเขาเป็นa
แล้วพลิกa
เหรียญ -biased n
ครั้ง คะแนนของคุณคือจำนวนการโทรโดยเฉลี่ยlen_lcs
ลำดับเหล่านี้คะแนนที่ต่ำกว่าจะดีกว่า การส่งของคุณควรบันทึกจำนวนการโทร ไม่มีการ จำกัด เวลายกเว้นว่าคุณควรเรียกใช้โปรแกรมของคุณในไฟล์ก่อนที่จะส่ง
การส่งของคุณจะถูกกำหนดไว้ อนุญาตให้ใช้ PRNG ได้ แต่ต้องใช้วันที่วันนี้200116
(หรือเทียบเท่าที่ใกล้เคียงที่สุด) เป็นเมล็ดสุ่ม คุณไม่ได้รับอนุญาตให้ปรับการส่งของคุณให้เหมาะสมกับกรณีทดสอบเหล่านี้ หากฉันสงสัยว่าสิ่งนี้กำลังเกิดขึ้นฉันจะสร้างแบทช์ใหม่
นี่ไม่ใช่รหัสกอล์ฟดังนั้นคุณควรเขียนรหัสที่อ่านได้ Rosetta รหัสมีหน้าบน subsequence ทั่วไปที่ยาวที่สุด ; คุณอาจใช้สิ่งนั้นเพื่อนำไปใช้len_lcs
ในภาษาที่คุณเลือก
lcs
len_lcs
lcs(R, "01"*2*n)
R
;) แต่ที่สามารถทำงานได้ถ้าโทรlcs(R, S)
จะเพิ่มคะแนนโดยการlen(S)
แทน 1, หรือสิ่งที่ต้องการ ...