선분 여행에 대한 인터뷰 퍼즐


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

첫 번째 테스트 케이스에 대한 답변은 12입니다. 먼저 red지점 에서 아이템 을 가져옵니다 0. 그런 다음 지점 6(거리 = 6)으로 이동 하고 red항목을 일시적으로 삭제 한 다음 항목을 가져옵니다 green. 그런 다음 5(distance = 1) 지점으로 이동 하여 green항목을 삭제하십시오 . 그런 다음 지점 6(distance = 1) 으로 되돌아 가서 red떨어 뜨린 아이템을 집어 들고 지점 9 (distance = 3)로 이동 한 다음 지점 10(distance = 1)으로 이동 하여 시퀀스를 완료합니다.

이동 한 총 거리는 6 + 1 + 1 + 3 + 1 = 12이며 가능한 최소 거리입니다.

다른 두 경우에 대한 답변이 12있다고 생각합니다. 그러나 그것을 해결하기위한 일반적인 규칙을 찾을 수 없습니다.

누구든지 아이디어가 있습니까?


내가 실수하지 않으면 "중복"을 계산하기 위해 데이터 구조가 필요하지 않습니까? 그렇지 않으면 잘못된 방법으로 해결하고 있습니다.
david

여전히 플래그를 지정할 수 있으며 모드에 동의하면 다시 열고 마이그레이션 할 것입니다.
ratchet freak

사이트가 닫혀 있더라도 사이트간에 질문을 자동으로 이동할 수 있습니다. 교차 게시하지 마십시오. 대신 @ratchetfreak의 조언을 따르고 중재주의 플래그를 지정하고 질문을 마이그레이션하도록 요청하십시오.
yannis

1
이것은 정말 몰래 들리지만, 한 조각의화물에 부딪 칠 때까지 오른쪽으로 움직이면 어떻게 될까요? 일단화물을 치고 나면 운반하고있는 것을 떨어 뜨리고 그화물을 집어 올린 다음 올바른 자리에 놓으십시오. 움직일 필요가있는 다른화물에 부딪 치면 전류를 떨어 뜨려 집어 들고 처리하십시오. 화물이 없으면 오른쪽으로 이동하십시오.
supersam654

1
모든 지점 또는 주어진 지점에 객체가 있습니까? 주어진 위치에 여러 객체를 가질 수 있습니까? 최종 위치가 아닌 다른 위치에 객체를 일시적으로 내려 놓을 수 있습니까?
Sean McSomething

답변:


4
  1. 비어 있다면 오른쪽으로 이동하십시오.

  2. 물체에 닿았 고 비었을 때마다 물체를 집어 들고 목적지로 이동하십시오.

  3. 물체에 닿아 a이미 가지고 다닐 b때는 항상 가장 왼쪽에있는 대상 중에서 가장 작은 대상을 선택하십시오.

  4. 아직 M이 아닌 경우 1 단계로 돌아가십시오.

이것이 가장 좋습니다. 실제로 선택할 수있는 유일한 단계는 3 단계입니다. 가장 왼쪽에있는 목적지를 먼저 처리하면 두 객체를 모두 파견 할 때 최대한 오른쪽에있게됩니다.

programmers.sx에 왜이 질문이 있습니까? 예, "인터뷰 질문"이지만 멋진 수수께끼입니다.

추신. 구현 측면에서 필요한 것은 원래 위치를 기준으로 정렬 된 작업 목록 (정수 포인트 쌍)입니다.


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 주석 후 업데이트 :
a 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

Move.Origin은 현재 이동할 객체가있는 위치입니다. 기본적으로, 움직임을 볼 때는 먼저 그 범위에 포함 된 작은 움직임을 수행하십시오.
Loren Pechtel

-1

이것은 비대칭 여행 세일즈맨 문제 입니다. 이것을 그래프로 생각할 수 있습니다. 가장자리는 각 (시작, 종료) 쌍, 각 (0, 시작) 및 다른 모든 쌍 (종료, 시작)입니다.

NP! = P라고 가정하면 예상 실행 시간이 기하 급수적으로 증가합니다.


3
나는 그것이 확실하지 않다. 이것은 비대칭 TSP 의 특별한 경우 이므로 다항식 시간 솔루션이있을 수 있습니다.
templatetypedef

(finish, M)과 같은 모서리가 필요하지 않습니다 M. 번호 줄의 끝 점이 어디에 있습니까?
david

또한 지수 알고리즘은 너무 느리므로 N100,000이 될 수 있습니다.
david

이 진술을 뒷받침하기 위해 아마도 모든 비대칭 여행 세일즈맨 문제를이 설명의 동등한 문제로 변환하는 방법이 있습니까?
dan_waterworth

1
동일하지 않습니다. 출장중인 판매원은 그래프의 모든 정점을 방문해야합니다. 조제시에는 모든 모서리를 방문해야합니다.
Alexis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.