কম্পিউটার টিউটোরিয়াল

Python-এ কোয়েরি থেকে নিকটতম রুম বের করার প্রোগ্রাম


মনে করুন rooms নামে একটি অ্যারে আছে। যেখানে rooms[i] একটি জোড়া [roomId_i, size_i] ধারণ করে যা একটি রুম নির্দেশ করে যার আইডি roomId_i এবং আকার size_i। সব রুম নম্বর ভিন্ন। আমাদের কাছে queries নামে আরেকটি অ্যারে আছে, যেখানে queries[j] একটি জোড়া [preferred_j, minSize_j] ধারণ করে। j-তম কোয়েরির উত্তর হল এমন একটি রুম নম্বর যাতে −

  • রুমটির আকার কমপক্ষে minSize_j, এবং

  • |id - preferred_j| ন্যূনতম।

এখন, যদি আবসোলিউট ডিফারেন্সে টাই হয়, তবে সবচেয়ে ছোট আইডি वाले রুম ব্যবহার করুন। যদি এমন কোনো রুম নেই, তবে -1 রিটার্ন করুন। সুতরাং আমাদের answer নামে একটি অ্যারে বের করতে হবে যার দৈর্ঘ্য queries-এর সমান এবং যেটি j-তম কোয়েরির উত্তর ধারণ করবে।

সুতরাং, যদি ইনপুট হয় rooms = [[2,2],[1,2],[3,2]] queries = [[3,1],[3,3],[5,2]], তবে আউটপুট হবে [3, -1, 3] কারণ

  • কোয়েরি [3,1] এর জন্য: রুম 3 সবচেয়ে নিকট কারণ |3 - 3| = 0, এবং এর আকার 2 কমপক্ষে 1, তাই উত্তর 3।

  • কোয়েরি [3,3] এর জন্য: আকার কমপক্ষে 3 এমন কোনো রুম নেই, তাই উত্তর -1।

  • কোয়েরি [5,2] এর জন্য: রুম 3 সবচেয়ে নিকট কারণ |3 - 5| = 2, এবং এর আকার 2 কমপক্ষে 2, তাই উত্তর 3।

এটি সমাধান করতে আমরা নিচের ধাপগুলো অনুসরণ করব −

  • রুমগুলো আকার অনুযায়ী সর্ট করুন, আকার সমান হলে রুম আইডি অনুযায়ী

  • queries = ইন্ডেক্স i এবং জোড়া (qid, size) এর জন্য (qid, size, i) জোড়ার একটি তালিকা

  • কোয়েরিগুলো আকার অনুযায়ী রিভার্স অর্ডারে সর্ট করুন, আকার সমান হলে preferred অনুযায়ী, আবার সমান হলে ইন্ডেক্স অনুযায়ী

  • ans := queries-এর আকারের একটি অ্যারে -1 দিয়ে পূরণ

  • X := একটি নতুন তালিকা

  • প্রতিটি (qid, size, i) in queries-এর জন্য, করুন

    • যতক্ষণ rooms খালি নয় এবং rooms-এর লাস্ট আইটেমের আকার >= size, করুন

      • (idr, _) := rooms থেকে লাস্ট এলিমেন্ট মুছে দিন

      • idr ইনসার্ট করার পর X সর্ট করুন

    • যদি X খালি নয়, তবে

      • j := সূচক যেখানে qid ইনসার্ট করলে X সর্টেড থাকবে

      • যদি j == X-এর আকার হয়, তবে

        • ans[i] := X-এর লাস্ট এলিমেন্ট

      • অন্যথায় যখন j == 0 হয়, তবে

        • ans[i] := X[0]

      • অন্যথায়,

        • যদি X[j] - qid < qid - X[j-1], তবে

          • ans[i] := X[j]

        • অন্যথায়,

          • ans[i] := X[j-1]

  • ans রিটার্ন করুন

উদাহরণ

বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশন দেখুন

import bisect

def solve(rooms, queries):
    rooms.sort(key=lambda x: (x[1], x[0]))
    queries = [(qid, size, i) for i, (qid, size) in enumerate(queries)]
    queries.sort(key=lambda x: (x[1], x[0], x[2]), reverse=True)
    ans = [-1] * len(queries)
    X = []
    for qid, size, i in queries:
        while rooms and rooms[-1][1] >= size:
            idr, _ = rooms.pop()
            bisect.insort(X, idr)
        if X:
            j = bisect.bisect(X, qid)
            if j == len(X):
                ans[i] = X[-1]
            elif j == 0:
                ans[i] = X[0]
            else:
                if X[j] - qid < qid - X[j-1]:
                    ans[i] = X[j]
                else:
                    ans[i] = X[j-1]
    return ans

rooms = [[2,2],[1,2],[3,2]]
queries = [[3,1],[3,3],[5,2]]
print(solve(rooms, queries))

ইনপুট

[[2,2],[1,2],[3,2]], [[3,1],[3,3],[5,2]]

আউটপুট

[3, -1, 3]

  1. পাইথনে আকার k-এর স্ট্রিক্টলি ইনক্রিজিং সাবসিকোয়েন্সের সংখ্যা গণনা করার প্রোগ্রাম

  2. পাইথনে দুটি সর্টেড লিংকড লিস্টের ইন্টারসেকশন বের করার প্রোগ্রাম

  3. দুই সর্টেড অ্যারে থেকে নিকটতম জোড়া বের করার পাইথন প্রোগ্রাম

  4. পাইথনে লিস্ট থেকে N বড় এলিমেন্ট বের করা