Câu đố phỏng vấn khi đi du lịch trên một đoạn đường


10

Trên một dòng số có độ dài M, trong đó 0 < M <= 1,000,000,000, bạn đã cho N( 1 < N <= 100,000) các cặp số nguyên. Trong mỗi cặp, điểm đầu tiên biểu thị vị trí của một đối tượng và điểm thứ hai biểu thị nơi một đối tượng sẽ được di chuyển. (Hãy nhớ rằng secondđiểm có thể nhỏ hơn first).

Bây giờ, giả sử bạn bắt đầu tại điểm 0và có một giỏ hàng có thể chứa 1đối tượng. Bạn muốn di chuyển tất cả các đối tượng từ vị trí ban đầu của chúng đến vị trí cuối cùng tương ứng của chúng trong khi di chuyển khoảng cách ít nhất dọc theo dòng số ( không phải dịch chuyển). Bạn phải kết thúc tại điểm M.

Bây giờ, tôi đã cố gắng giảm vấn đề này thành một vấn đề đơn giản hơn. Thành thật mà nói tôi thậm chí không thể nghĩ ra một giải pháp vũ phu ( có thể là tham lam). Tuy nhiên, suy nghĩ đầu tiên của tôi là làm thoái hóa một chuyển động lùi về hai chuyển động về phía trước, nhưng dường như điều đó không hiệu quả trong mọi trường hợp.

Tôi đã rút ra các 3trường hợp thử nghiệm mẫu ở đây:http://i.stack.imgur.com/zRv4Q.png

Câu trả lời cho testcase đầu tiên là 12. Đầu tiên, bạn chọn redmục tại điểm 0. Sau đó, bạn di chuyển đến điểm 6(khoảng cách = 6), redtạm thời thả vật phẩm, sau đó nhặt greenvật phẩm lên. Sau đó, bạn di chuyển đến điểm 5(khoảng cách = 1) và thả greenvật phẩm. Sau đó, bạn di chuyển trở lại điểm 6(khoảng cách = 1) và nhặt redvật phẩm bạn đánh rơi, di chuyển đến điểm 9 (khoảng cách = 3), sau đó di chuyển đến điểm 10(khoảng cách = 1) để kết thúc chuỗi.

Tổng quãng đường đã đi là 6 + 1 + 1 + 3 + 1 = 12khoảng cách tối thiểu có thể.

Hai trường hợp khác có câu trả lời 12, tôi tin. Tuy nhiên, tôi không thể tìm thấy một quy tắc chung để giải quyết nó.

Bất cứ ai có ý tưởng?


Nếu tôi không nhầm, bạn có cần cơ sở hạ tầng để đếm "sự chồng chéo" không? Nếu không thì tôi đang giải quyết nó sai cách.
david

bạn vẫn có thể gắn cờ và nếu mod đồng ý anh ta sẽ mở lại và di chuyển
ratchet freak

Chúng tôi có thể tự động di chuyển các câu hỏi giữa các trang web (ngay cả khi chúng bị đóng), vui lòng không đăng bài chéo. Thay vào đó, hãy làm theo lời khuyên của @ ratchetfreak, gắn cờ cho sự chú ý kiểm duyệt và yêu cầu di chuyển câu hỏi.
yannis

1
Điều này nghe có vẻ thực sự, nhưng nếu bạn bắt đầu bằng cách di chuyển sang phải cho đến khi bạn va phải một mảnh hàng hóa. Khi bạn nhấn hàng hóa đó, thả bất cứ thứ gì bạn đang mang, nhặt hàng hóa đó và tiến hành đặt nó vào đúng vị trí. Nếu bạn va vào một mảnh hàng hóa khác cần phải di chuyển, thả dòng điện, nhặt nó lên và đối phó với nó. Khi bạn không có hàng hóa, di chuyển ngay.
supersam654

1
Các đối tượng tồn tại ở tất cả các điểm hoặc chỉ những người nhất định? Có thể có nhiều đối tượng tại một địa điểm nhất định? Có được phép đặt tạm thời một đối tượng ở một vị trí không phải là đối tượng cuối cùng không?
Sean McS Something 22/2/13

Câu trả lời:


4
  1. Nếu bạn trống, bắt đầu di chuyển sang phải.

  2. Bất cứ khi nào bạn tiếp cận một đối tượng và bạn trống rỗng, hãy nhặt nó lên (duh) và di chuyển đến đích của nó.

  3. Bất cứ khi nào bạn tiếp cận một đối tượng avà bạn đã mang theo b, hãy luôn chọn bất kỳ đối tượng nào có đích nhỏ nhất về số lượng (xa nhất bên trái).

  4. Nếu bạn chưa ở M, hãy quay lại bước 1.

Điều này là tối ưu: Nơi duy nhất mà bạn có lựa chọn thực sự là ở bước 3. Xử lý điểm đến ngoài cùng trước tiên đảm bảo rằng vào thời điểm bạn gửi cả hai đối tượng, bạn sẽ càng xa bên phải càng tốt.

Tại sao câu hỏi này trên lập trình viên.sx? Vâng, "câu hỏi phỏng vấn", nhưng nó chỉ là một câu đố hay.

Tái bút Về mặt thực hiện, tất cả những gì bạn cần là danh sách các nhiệm vụ (các cặp số nguyên) được sắp xếp theo vị trí ban đầu.


1

Giả sử bạn được cung cấp những di chuyển này (a, b), (c, d), (e, f), ...thì khoảng cách tối thiểu bạn phải đi là abs(b - a) + abs(d - c) + abs(f - e) + ...và khoảng cách thực tế bạn đi là abs(b - a) + abs(c - b) + abs(d - c) + abs(e - d) + ....
Về cơ bản, với một loạt các bước di chuyển, điểm là để giảm thiểu chức năng "khoảng cách di chuyển" bằng cách hoán đổi các yếu tố xung quanh. Nếu bạn coi một kết hợp cụ thể là một nút và tất cả các kết hợp bạn có thể tiếp cận từ nó như các cạnh, bạn có thể sử dụng một trong nhiều thuật toán tìm kiếm đồ thị xung quanh để sử dụng phương pháp phỏng đoán. Một ví dụ là tìm kiếm chùm tia .


0

Có thể tôi đang hiểu sai vấn đề nhưng những điều sau đây:

  1. Sắp xếp các cặp theo số đầu tiên của cặp là vị trí hiện tại
  2. Di chuyển dọc theo các phần tử hoán đổi vị trí đến vị trí thích hợp của chúng (bạn có một biến tạm thời)

Thực tế là nó được sắp xếp đảm bảo rằng bạn không qua lại các phần tử để đặt chúng vào vị trí thích hợp (bất kể dòng được biểu diễn dưới dạng một mảng hay danh sách)

Cập nhật sau khi nhận xét @templatetypedef:
Sử dụng a HashTableđể lưu trữ tất cả các cặp. Sử dụng vị trí hiện tại của mỗi cặp làm khóa chỉ mục.
Sử dụng một chỉ số thứ hai trên các cặp.

 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  

Bạn chỉ có thể di chuyển một đơn vị tại một thời điểm, vì vậy nhiều lần bạn phải truy xuất con đường của mình tôi nghĩ
david

Tôi không thực sự theo dõi bạn. Có vẻ như yêu cầu chỉ là tiến lên và trao đổi số. Bạn đã biết vị trí hiện tại và vị trí mục tiêu. Chỉ cần trao đổi chúng (sử dụng biến giỏ hàng như bạn nói) và di chuyển đến cặp tiếp theo
user10326

Hãy xem xét ví dụ này: (1, 10), (10, 1), (2, 3), (3, 4). Cách tối ưu để làm điều này là mang đối tượng 1 đến vị trí 10, sau đó nhấc đối tượng ở vị trí 10 và mang nó đến vị trí 1, sau đó mang 2 đến 3 và 3 đến 4. Thực hiện việc này theo cách sắp xếp thứ tự của vị trí bắt đầu sẽ mang số 1 đến số 10, sau đó quay ngược về điểm bắt đầu để mang số 2 đến số 3, số 3 đến số 4, sau đó đi đến điểm cuối để nhận số 10 và mang theo nó trở lại
templatetypedef

@templatetypedef: Tôi hiểu ý của bạn. Câu trả lời cập nhật
user10326

Trong câu trả lời cập nhật của bạn, "chỉ số hiện tại" chỉ cho biết vị trí hiện tại?
david

0

Quan điểm của tôi về một thuật toán mà về cơ bản là tham lam:

Xây dựng một danh sách các điểm cần phải di chuyển. Vì tối ưu hóa nên đây không phải là một phần của vấn đề bắt buộc, tôi sẽ không lo lắng về việc tổ chức nó.

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()

Tôi nghĩ rằng điều này bao gồm tất cả các trường hợp. Theo một nghĩa nào đó, nó đệ quy nhưng thông qua việc cập nhật danh sách chứ không phải gọi chính nó.


Cảm ơn câu trả lời. Bạn có thể giải thích Destination = SubList.FindSmallest(Location, Move.Origin)? Không gì Move.Originđại diện?
david

Move.Origin là vị trí mà đối tượng cần di chuyển hiện tại - đó là nguồn gốc. Về cơ bản, khi nhìn vào một nước đi, trước tiên hãy thực hiện bất kỳ động thái nhỏ hơn nào trong phạm vi của nó.
Loren Pechtel

-1

Đây là vấn đề nhân viên bán hàng đi du lịch không đối xứng . Bạn có thể nghĩ về điều này như một biểu đồ. Các cạnh sẽ là mỗi cặp (bắt đầu, kết thúc), một cho mỗi (0, bắt đầu) và tất cả các cặp khác (kết thúc, bắt đầu).

Giả sử NP! = P, nó sẽ có thời gian chạy dự kiến ​​theo cấp số nhân.


3
Tôi không chắc đó là sự thật. Đây là trường hợp đặc biệt của TSP không đối xứng, vì vậy nó có thể có giải pháp thời gian đa thức.
templatetypedef

Bạn không cần một cạnh như (kết thúc, M), Mđiểm cuối của dòng số ở đâu?
david

Ngoài ra, một thuật toán theo cấp số nhân là quá chậm, Ncó thể là 100.000.
david

Để sao lưu tuyên bố này, có lẽ bạn có một phương pháp chuyển đổi mọi vấn đề của nhân viên bán hàng đi du lịch không đối xứng thành một vấn đề tương đương của mô tả này?
dan_waterworth

1
Nó không tương đương. Nhân viên bán hàng du lịch phải ghé thăm tất cả các đỉnh của đồ thị. Công thức của bạn yêu cầu anh ấy / cô ấy đến thăm tất cả các cạnh.
alexis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.