ปริศนาสัมภาษณ์เกี่ยวกับการเดินทางในส่วนของเส้น


10

บนบรรทัดจำนวนความยาวMโดยที่0 < M <= 1,000,000,000คุณได้รับN( 1 < N <= 100,000) จุดจำนวนเต็ม ในแต่ละคู่จุดแรกแทนตำแหน่งที่วัตถุอยู่ในขณะนี้และจุดที่สองแสดงถึงจุดที่ควรย้ายวัตถุ (โปรดทราบว่าsecondจุดอาจเล็กกว่าfirst)

ทีนี้สมมติว่าคุณเริ่มจากจุดนั้น0และมีรถเข็นที่สามารถเก็บ1วัตถุได้ คุณต้องการย้ายวัตถุทั้งหมดจากตำแหน่งเริ่มต้นของพวกเขาไปยังตำแหน่งสุดท้ายของพวกเขาในขณะที่เดินทางระยะทางน้อยที่สุดตามแนวหมายเลข ( ไม่ใช่การกระจัด) Mคุณจะต้องจบลงในประเด็น

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

ฉันดึง3กรณีทดสอบตัวอย่างเหล่านี้มาที่นี่:http://i.stack.imgur.com/zRv4Q.png

คำตอบ testcase 12แรกคือ ครั้งแรกที่คุณรับรายการที่จุดred 0จากนั้นคุณย้ายไปที่จุด6(ระยะทาง = 6) วางredรายการชั่วคราวจากนั้นเลือกgreenรายการ จากนั้นคุณย้ายไปที่จุด5(ระยะทาง = 1) และวางgreenรายการ จากนั้นคุณย้ายกลับไปที่จุด6(ระยะทาง = 1) และรับredรายการที่คุณทิ้งย้ายไปยังจุดที่ 9 (ระยะทาง = 3) จากนั้นเลื่อนไปที่จุด10(ระยะทาง = 1) เพื่อจบลำดับ

ระยะทางทั้งหมดที่เดินทางคือ6 + 1 + 1 + 3 + 1 = 12ซึ่งเป็นระยะทางต่ำสุดที่เป็นไปได้

อีกสองกรณีมีคำตอบ12ฉันเชื่อว่า อย่างไรก็ตามฉันไม่สามารถหากฎทั่วไปเพื่อแก้ไขได้

ใครมีความคิดเห็นบ้าง


ถ้าฉันไม่เข้าใจผิดคุณไม่จำเป็นต้องมีโครงสร้างข้อมูลเพื่อนับ "ทับซ้อน" หรือไม่? มิฉะนั้นฉันจะแก้มันในทางที่ผิด
david

คุณยังสามารถตั้งค่าสถานะและถ้า mod เห็นด้วยเขาจะเปิดใหม่และโยกย้าย
วงล้อประหลาด

เราสามารถย้ายคำถามระหว่างไซต์โดยอัตโนมัติ (แม้ว่าจะถูกปิด) โปรดอย่าข้ามโพสต์ ให้ทำตามคำแนะนำของ @ ratchetfreak แทนให้ความสนใจในการกลั่นกรองและขอให้โยกย้ายคำถาม
yannis

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

1
วัตถุมีอยู่จริงหรือไม่ เป็นไปได้หรือไม่ที่จะมีวัตถุหลายชิ้นในสถานที่ที่กำหนด? อนุญาตให้วางวัตถุลงในสถานที่อื่นนอกเหนือจากวัตถุสุดท้ายได้หรือไม่?
Sean McSomething

คำตอบ:


4
  1. หากคุณว่างเริ่มย้ายไปทางขวา

  2. เมื่อใดก็ตามที่คุณไปถึงวัตถุและคุณว่างให้หยิบมันขึ้นมา (duh) แล้วเคลื่อนที่ไปยังปลายทาง

  3. เมื่อใดก็ตามที่คุณไปถึงวัตถุaและคุณกำลังแบกแล้วb, เสมอเลือกแล้วแต่จำนวนใดของวัตถุที่มีปลายทางตัวเลขที่เล็กที่สุด (ไกลไปทางซ้าย)

  4. หากคุณยังไม่อยู่ที่ M ให้กลับไปที่ขั้นตอนที่ 1

นี่เป็นสิ่งที่ดีที่สุด: สถานที่เดียวที่คุณมีตัวเลือกจริงอยู่ในขั้นตอนที่ 3 การจัดการปลายทางที่อยู่ทางซ้ายสุดก่อนทำให้แน่ใจว่าเมื่อคุณส่งวัตถุทั้งสองไปคุณจะอยู่ทางขวาสุดเท่าที่จะทำได้

ทำไมคำถามนี้ถึง programmers.sx ใช่ "คำถามสัมภาษณ์" แต่มันก็เป็นปริศนาที่ดี

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


1

สมมติว่าคุณจะได้รับการเคลื่อนไหวเหล่านี้(a, b), (c, d), (e, f), ...แล้วระยะทางขั้นต่ำที่คุณต้องเดินทางและระยะทางจริงคุณเดินทางคือabs(b - a) + abs(d - c) + abs(f - e) + ... โดยทั่วไปเมื่อกำหนดให้มีการย้ายจุดคือการลดฟังก์ชั่น "ระยะทางในการเดินทาง" โดยการสลับองค์ประกอบรอบ ๆ หากคุณพิจารณาชุดค่าผสมเฉพาะเป็นโหนดและชุดค่าผสมทั้งหมดที่คุณสามารถเข้าถึงได้เป็นขอบคุณสามารถใช้หนึ่งในอัลกอริทึมการค้นหากราฟหลายรอบซึ่งใช้ประโยชน์จากการเรียนรู้แบบฮิวริสติก ตัวอย่างหนึ่งคือการค้นหาคานabs(b - a) + abs(c - b) + abs(d - c) + abs(e - d) + ...


0

ฉันอาจจะเข้าใจผิดเกี่ยวกับปัญหา แต่สิ่งต่อไปนี้:

  1. เรียงลำดับคู่ตามหมายเลขแรกของคู่ซึ่งเป็นที่ตั้งปัจจุบัน
  2. ย้ายไปตามองค์ประกอบการสลับบรรทัดไปยังตำแหน่งที่เหมาะสม (คุณมีตัวแปรชั่วคราว)

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

อัปเดตหลังจากความคิดเห็น @templatetypedef:
ใช้HashTableเพื่อเก็บคู่ทั้งหมด ใช้ตำแหน่งปัจจุบันของแต่ละคู่เป็นคีย์ดัชนี
ใช้ดัชนีที่สองเหนือคู่

 1. Get next pair according to index from the line.
 2. If current pair exists in hashtable then place element to its target location.  
    2.a Remove pair from hashtable.  
    2.b Make current pair the target location. Then go to step 1  
 ELSE 
        Increment current index until you get a pair present in the hashtable. Go to step 2  

คุณสามารถย้ายหน่วยหนึ่งในเวลาดังนั้นหลายครั้งที่คุณต้องย้อนรอยเส้นทางของคุณผมคิดว่า
david

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

พิจารณาตัวอย่างตัวอย่างนี้: (1, 10), (10, 1), (2, 3), (3, 4) วิธีที่ดีที่สุดในการทำเช่นนี้คือนำวัตถุ 1 ไปยังตำแหน่ง 10 จากนั้นหยิบวัตถุที่ตำแหน่ง 10 และดำเนินการไปยังตำแหน่ง 1 จากนั้นจึงดำเนินการ 2 ถึง 3 และ 3 ถึง 4 ทำสิ่งนี้ในการจัดเรียง คำสั่งของตำแหน่งเริ่มต้นจะดำเนินการ 1 ถึง 10 จากนั้นกลับไปตลอดทางจนถึงจุดเริ่มต้นที่จะดำเนินการ 2 ถึง 3, 3 ถึง 4 จากนั้นไปตลอดทางจนถึงจุดสิ้นสุดเพื่อรับ 10 และนำ มันกลับมา
templatetypedef

@templatetypedef: ฉันเห็นสิ่งที่คุณหมายถึงคำตอบที่ปรับปรุงแล้ว
user10326

ในคำตอบที่อัปเดตแล้ว "ดัชนีปัจจุบัน" เพียงระบุตำแหน่งปัจจุบันหรือไม่
david

0

ความชอบของฉันเกี่ยวกับอัลกอริทึมซึ่งโดยทั่วไปแล้วโลภ:

สร้างรายการของจุดที่ต้องย้าย เนื่องจากการปรับให้เหมาะสมนี่ไม่ใช่ส่วนหนึ่งของปัญหาที่ต้องการฉันจะไม่กังวลเกี่ยวกับการจัดระเบียบ

while !Done
    if CartIsEmpty()
        FindClosestObjectToMove()
        MoveToObject()
       LoadCart()
    else
        Destination = Cart.Contains.Target
        CurrentMove = [Location, Destination]
        SubList = List.Where(Move.Within(CurrentMove))
        if !SubList.Empty
            Destination = SubList.FindSmallest(Location, Move.Origin)
        MoveTo(Destination)
        if !Destination.Empty
            SwapCart()
            UpdateTaskList()
        else
            EmptyCart()
            DeleteTask()

ฉันคิดว่านี่ครอบคลุมทุกกรณี ในความรู้สึกมันซ้ำ แต่ผ่านการปรับปรุงเป็นรายการมากกว่าเรียกตัวเอง


ขอบคุณสำหรับคำตอบ. คุณอธิบายได้Destination = SubList.FindSmallest(Location, Move.Origin)ไหม สิ่งใดMove.Originเป็นตัวแทน?
david

ย้ายต้นกำเนิดคือตำแหน่งที่วัตถุที่จะย้ายในปัจจุบันคือต้นกำเนิด โดยทั่วไปเมื่อดูที่การเคลื่อนไหวก่อนอื่นให้ทำการเคลื่อนไหวเล็ก ๆ ที่อยู่ภายในระยะนั้น
Loren Pechtel

-1

นี่คือปัญหาพนักงานขายที่เดินทางไม่สมมาตร คุณคิดว่านี่เป็นกราฟ ขอบจะเป็นคู่ (เริ่ม, เสร็จสิ้น), หนึ่งคู่สำหรับแต่ละ (0, เริ่ม), และคู่อื่น ๆ (เสร็จสิ้น, เริ่ม)

สมมติว่า NP! = P มันจะมีเวลาทำงานแบบเอ็กซ์โพเนนเชียลที่คาดหวัง


3
ฉันไม่แน่ใจว่าเป็นเรื่องจริง นี่เป็นกรณีพิเศษของ TSP แบบไม่สมมาตรดังนั้นจึงอาจมีวิธีแก้ปัญหาเวลาพหุนาม
templatetypedef

คุณไม่ต้องการขอบเช่น (finish, M), Mจุดปลายของบรรทัดตัวเลขอยู่ที่ไหน?
david

นอกจากนี้อัลกอริธึมแบบเอ็กซ์โปเนนเชียลนั้นช้าเกินไปเพราะNอาจเป็น 100,000
david

หากต้องการสำรองข้อความนี้ขึ้นมาสมมุติว่าคุณมีวิธีที่จะเปลี่ยนปัญหาพนักงานขายที่ไม่สมมาตรทุกคนให้เป็นปัญหาที่เทียบเท่ากับคำอธิบายนี้หรือไม่?
dan_waterworth

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