मैं onlinejudge.org - The 3n + से एक प्रश्न हल करने का प्रयास कर रहा हूं 1 समस्या पायथन का उपयोग करना।

यदि लिंक लोड नहीं होता है (जो अक्सर होता है), तो नीचे प्रश्न का मेरा संक्षिप्त संस्करण है:

निम्नलिखित एल्गोरिथम पर विचार करें:

  1. इनपुट नंबर
  2. प्रिंट नंबर
  3. अगर n = 1 तो बंद करो
  4. यदि n विषम है तो n <- 3n + 1
  5. अन्य n <- n/2
  6. गोटो २

इनपुट 22 को देखते हुए, संख्याओं का निम्नलिखित क्रम 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 मुद्रित किया जाएगा।

ऊपर के उदाहरण में, 22 की चक्र लंबाई 16 है।

किन्हीं दो संख्याओं i और j के लिए आपको i और j दोनों के बीच और सहित सभी संख्याओं पर अधिकतम चक्र लंबाई निर्धारित करनी है।

नमूना इनपुट

1 10
100 200
201 210
900 1000

नमूना आउटपुट

1 10 20
100 200 125
201 210 89
900 1000 174

और यहाँ मेरा कोड है।

inputText = input().split()

inputList=[]
for index in range(0, len(inputText), 2):
    inputList.append([int(inputText[index]), int(inputText[index + 1])])

def CycleLen(num):
    chainList = [num]
    while num > 1:
        chainList.append(num//2 if num % 2 == 0 else 3*num + 1)
        num = chainList[-1]
    return len(chainList)

for listSet in inputList:
    countList = []
    minRange = min(listSet[0], listSet[1])
    maxRange = max(listSet[0], listSet[1])
    for num in range(minRange, maxRange + 1):
        countList.append(CycleLen(num))

    countList.sort()
    print(listSet[0], listSet[1], countList[-1])

मैं इसे और अधिक समय कुशल बनाने के लिए याद करने के समाधान के बारे में जानता हूं, लेकिन मैंने इसे लागू करने की योजना बनाई है, अगर प्रश्न ने समय सीमा से अधिक के लिए मेरे उत्तर को खारिज कर दिया। हालाँकि, मुझे सीधे गलत उत्तर मिल रहा है, और मुझे नहीं पता कि क्यों।

मैंने यूडीबग का उपयोग यह देखने के लिए किया कि क्या कोई गलती है, और दूसरे के समाधान की खोज की। सबसे भ्रमित करने वाला हिस्सा यह है कि ऑनलाइन जज कैसे अपना इनपुट सबमिट करता है - सिंगल लाइन बाय लाइन, या सभी लाइन एक बार में। विभिन्न स्रोत अलग-अलग चीजों का दावा करते हैं।

कृपया मदद करे। शुक्रिया!

1
Sim Ho 9 अक्टूबर 2020, 07:55

1 उत्तर

सबसे बढ़िया उत्तर

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

इनपुट में जोड़ों की एक श्रृंखला पूर्णांक i और j, प्रति पंक्ति पूर्णांकों की एक जोड़ी शामिल होगी। सभी पूर्णांक १०,००० से कम और ० से अधिक होंगे।

आपको पूर्णांकों के सभी जोड़े को संसाधित करना चाहिए और प्रत्येक जोड़ी के लिए i और j के बीच और सहित सभी पूर्णांकों पर अधिकतम चक्र लंबाई निर्धारित करनी चाहिए।

इसलिए, आपका कोड जिसे केवल एक जोड़ा मिलता है वह पर्याप्त नहीं होगा। कारण यह केवल एक जोड़ी को प्रोसेस करता है जिसका संबंध इस गलतफहमी से है कि कोड:

inputText = input().split()

आपको सभी इनपुट लाइनें देगा, जैसा कि लूप द्वारा प्रमाणित किया गया है जो प्रत्येक जोड़ी से 2-टुपल्स की सूची बनाने की कोशिश करता है:

inputList=[]
for index in range(0, len(inputText), 2):
    inputList.append([int(inputText[index]), int(inputText[index + 1])])

हालांकि, input() इनपुट की केवल एक लाइन पढ़ता है (देखें यहां), जिसका अर्थ है कि आप बहु-पंक्ति इनपुट की केवल पहली लाइन को ही प्रोसेस करेंगे। इसे ठीक से करने के लिए, आपको फ़ाइल के समाप्त होने तक लाइनों को लगातार पढ़ना और संसाधित करना होगा।


ऐसा कहने के बाद, यदि आप समय सीमा से अधिक हो जाते हैं, तो आप अपने पहले चरण के रूप में सूचियों के उपयोग पर पुनर्विचार करना चाह सकते हैं। वर्तमान आइटम को बनाए रखना और चक्र की लंबाई (व्यक्तिगत चक्रों के लिए) की गणना के लिए और केवल इनपुट लाइनों को क्रमिक रूप से (विभिन्न श्रेणियों के लिए) संसाधित करना कहीं अधिक आसान होगा। उन पहलुओं में से किसी को भी वास्तविक सूची की आवश्यकता नहीं है।


उन दोनों सूची मुद्दों (और ऊपर उल्लिखित एक-पंक्ति-इन-इनपुट समस्या) को संबोधित करते हुए, आप कुछ इस तरह समाप्त करेंगे:

def CycleLen(num):
    # Start with one number, the one given.

    curr = num
    count = 1

    # Until you get to 1, increase count and calculate next.

    while curr > 1:
        count += 1
        curr = curr // 2 if curr% 2 == 0 else curr * 3 + 1

    return count

while True:
    # Reads a single line and splits into integers. Any problem, exit loop.

    try:
        inputInt = [int(item) for item in input().split()]
        if len(inputInt) != 2: break
    except:
        break

    # Find value in the range with the longest cycle then print it.

    maxCycle = 0
    for number in range(min(inputInt), max(inputInt) + 1):
        maxCycle = max(maxCycle, CycleLen(number))
    print(inputInt[0], inputInt[1], maxCycle)
3
paxdiablo 9 अक्टूबर 2020, 11:04