एक लाइन खंड पर यात्रा पर साक्षात्कार पहेली


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(दूरी = 1) पर जाते हैं और greenआइटम को छोड़ते हैं । फिर आप बिंदु पर वापस जाते हैं6 (दूरी = 1) पर और redआपके द्वारा गिराया गया आइटम उठाते हैं , बिंदु 9 (दूरी = 3) पर जाते हैं, फिर अनुक्रम को समाप्त करने के लिए बिंदु 10(दूरी = 1) पर जाते हैं।

कुल दूरी तय की गई 6 + 1 + 1 + 3 + 1 = 12, जो न्यूनतम संभव दूरी है।

अन्य दो मामलों के उत्तर हैं 12, मेरा मानना ​​है। हालाँकि, मैं इसे हल करने के लिए एक सामान्य नियम नहीं खोज सकता।

किसी को कोई विचार मिला?


अगर मैं गलत नहीं हूं, तो क्या आपको "ओवरलैप" की गिनती करने के लिए डेटासट्रक्चर की आवश्यकता नहीं होगी? अन्यथा मैं इसे गलत तरीके से हल कर रहा हूं।
david

आप अभी भी झंडा लगा सकते हैं और अगर मॉड सहमत है तो वह फिर से खुल जाएगा और पलायन करेगा
शाफ़्ट फ्रीक

हम स्वचालित रूप से साइटों के बीच प्रश्नों को स्थानांतरित कर सकते हैं (भले ही वे बंद हों), कृपया पोस्ट को पार न करें। इसके बजाय, @ ratchetfreak की सलाह का पालन करें, मॉडरेशन के लिए ध्वज को ध्यान में रखें और प्रश्न को माइग्रेट करने के लिए कहें।
यानिस

1
यह वास्तव में बहुत बुरा लगता है, लेकिन क्या होगा यदि आप तब तक दाईं ओर चलकर शुरू करते हैं जब तक आप कार्गो के एक टुकड़े को नहीं मारते। एक बार जब आप उस कार्गो को मारते हैं, तो आप जो भी ले जा रहे हैं, उस कार्गो को उठाएं, और उसे सही जगह पर रखें। यदि आप कार्गो के एक और टुकड़े को मारते हैं जिसे स्थानांतरित करने की आवश्यकता है, तो वर्तमान को छोड़ दें, इसे उठाएं, और इसके साथ व्यवहार करें। जब आपके पास कोई कार्गो न हो, तो सही से चलें।
supersam654 3

1
क्या सभी बिंदुओं पर वस्तुएं मौजूद हैं या सिर्फ दिए गए हैं? क्या किसी दिए गए स्थान पर कई वस्तुओं का होना संभव है? क्या किसी वस्तु को अपने अंतिम स्थान के अलावा किसी अन्य स्थान पर अस्थायी रूप से सेट करने की अनुमति है?
शॉन मैकसमरिंग

जवाबों:


4
  1. यदि आप खाली हैं, तो दाईं ओर बढ़ना शुरू करें।

  2. जब भी आप किसी वस्तु तक पहुंचते हैं और आप खाली होते हैं, तो उसे उठाएं (डुह) और अपने गंतव्य की ओर बढ़ें।

  3. जब भी आप किसी वस्तु तक पहुँचते हैं aऔर आप पहले से ही ले जाते हैं b, हमेशा हैं चुनें कि वस्तुओं में से कौन सा अंक सबसे छोटा गंतव्य है (बाईं ओर स्थित है)।

  4. यदि आप अभी तक M पर नहीं हैं, तो चरण 1 पर वापस जाएं।

यह इष्टतम है: एकमात्र स्थान जहां आपके पास वास्तविक विकल्प है चरण 3 में। बाईं ओर के गंतव्य को पहले संभालना सुनिश्चित करता है कि जब तक आप दोनों वस्तुओं को भेजते हैं, तब तक आप यथासंभव दाईं ओर होंगे।

प्रोग्रामर.एसएक्स पर यह सवाल क्यों है? हां, "साक्षात्कार प्रश्न", लेकिन यह सिर्फ एक अच्छी पहेली है।

पुनश्च। कार्यान्वयन के संदर्भ में, आपको मूल स्थिति द्वारा छांटे गए कार्यों (अंकों के पूर्णांक जोड़े) की सूची है।


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 सभी जोड़े को संग्रहीत करने के लिए a का उपयोग करें । सूचकांक कुंजी के रूप में प्रत्येक जोड़ी के वर्तमान स्थान का उपयोग करें।
जोड़े पर एक दूसरे सूचकांक का उपयोग करें।

 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 20

इस प्रतिधारण पर विचार करें: (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प्रतिनिधित्व करता है ?
डेविड

Move.Origin वह स्थान है जहां वर्तमान में ले जाया जाने वाला ऑब्जेक्ट है - यह मूल है। मूल रूप से, जब किसी चाल को देखते हैं तो पहले किसी छोटे चाल को सम्‍मिलित करते हैं।
लोरेन Pechtel

-1

यह असममित यात्रा विक्रेता समस्या है । आप इसे एक ग्राफ के रूप में सोच सकते हैं। किनारों प्रत्येक (शुरू, खत्म) जोड़ी होगी, प्रत्येक के लिए एक (0, शुरू), और (खत्म, शुरू) के अन्य सभी जोड़े।

एनपी मान रहे हैं! = पी, यह एक घातीय अपेक्षित समय चल रहा होगा।


3
मुझे यकीन नहीं है कि यह सच है। यह असममित टीएसपी का एक विशेष मामला है, इसलिए इसका एक बहुपद-समय समाधान हो सकता है।
templatetypedef

क्या आपको किनारों की आवश्यकता नहीं है जैसे (फिनिश, M), Mसंख्या रेखा का समापन बिंदु कहाँ है?
डेविड

इसके अलावा, एक घातीय एल्गोरिथ्म रास्ता बहुत धीमा है, N100,000 के लिए हो सकता है।
david

इस कथन को वापस करने के लिए, संभवत: आपके पास इस विवरण की समतुल्य समस्या वाले प्रत्येक असममित ट्रैवलिंग सेल्समैन समस्या को बदलने की एक विधि है?
dan_waterworth

1
यह समकक्ष नहीं है। ट्रैवल सेल्समैन को ग्राफ के सभी कोने पर जाना चाहिए। आपके सूत्रीकरण के लिए उसे / सभी किनारों पर जाने की आवश्यकता होती है।
एलेक्सिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.