พิจารณาการเปลี่ยนแปลงของค่าจำนวนเต็มจากไป1
N
เช่นตัวอย่างนี้สำหรับN = 4
:
[1, 3, 4, 2]
เราจะถือว่ารายการนี้เป็นวงจรเช่นนั้น1
และ2
ได้รับการปฏิบัติเหมือนติดกัน ปริมาณหนึ่งที่เราสามารถคำนวณได้สำหรับรายการดังกล่าวคือผลต่างกำลังสองรวมของค่าที่อยู่ติดกัน:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
N
งานของคุณคือการหาการเปลี่ยนแปลงซึ่งจะเพิ่มปริมาณนี้ให้เป็นจำนวนเต็มบวก ในกรณีของN = 4
ตัวอย่างข้างต้นจะไม่เหมาะสมที่สุด (อันที่จริงแล้วเป็นเพียงเล็กน้อย) เราสามารถบรรลุผลต่างกำลังสองรวม18
กับการเปลี่ยนแปลงต่อไปนี้ (รวมถึงการเปลี่ยนแปลงอื่น ๆ ):
[1, 4, 2, 3]
อัลกอริทึมของคุณต้องทำงานในเวลาพหุนาม (จากN
) โดยเฉพาะอย่างยิ่งคุณไม่สามารถคำนวณความแตกต่างยกกำลังสองทั้งหมดของพีชคณิตทั้งหมดได้
คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์
ผลลัพธ์อาจอยู่ในรูปแบบรายการแบบแบนหรือแบบสตริงที่สะดวกใด ๆ คุณอาจเลือกที่จะกลับรายการที่มีค่าจาก0
การN-1
แทนไป1
N
ใช้กฎมาตรฐานของกอล์ฟ
ทดสอบข้อมูล
มีวิธีการวิเคราะห์ที่ดีสำหรับปัญหานี้ เช่นโซลูชันที่ถูกต้องทั้งหมดN = 10
จะเทียบเท่ากับรายการต่อไปนี้ (มากถึงกะกะและกลับรายการ):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
ฉันไม่ต้องการเปิดเผยมากไปกว่านั้น (แม้ว่ามันอาจจะเพียงพอที่จะเข้าใจรูปแบบ) ดังนั้นแทนที่จะให้ตัวอย่างเพิ่มเติมอีกคุณสามารถตรวจสอบได้ว่าผลลัพธ์ของคุณมีความแตกต่างยกกำลังสองทั้งหมดดังต่อไปนี้N
:
N Total squared difference
1 0
2 2
3 6
4 18
5 36
6 66
7 106
8 162
9 232
10 322
33 11936
100 333202
333 12308236
1000 333332002
นี่คือรายการ OEIS A064842 (ซึ่งมีการอ้างอิงถึงกระดาษพร้อมวิธีการแก้ไขปัญหานี้หากคุณติดอยู่)
(i<n/2||n%2)^i%2?i+1:n-i
ได้