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

সি++-এ সর্বোচ্চ স্কোরের জন্য ন্যূনতম রোটেশন (Smallest Rotation with Highest Score)

মনে করুন, আমাদের একটি অ্যারে A আছে। আমরা এটি K দিয়ে রোটেট করতে পারি যাতে অ্যারেটি হয় A[K], A[K+1], A[K+2], ... A[A.length-1], A[0], A[1], ..., A[K-1]। তারপর, যেসব এন্ট্রি তাদের ইনডেক্স থেকে ছোট বা সমান, সেগুলো ১ পয়েন্ট পাবে।

যেমন, অ্যারে [2, 4, 1, 3, 0] এবং K = 2 হলে, এটি হয়ে যায় [1, 3, 0, 2, 4]। এটিকে ৩ পয়েন্ট मिलবে কারণ ১ > ০ [পয়েন্ট নেই], ৩ > ১ [পয়েন্ট নেই], ০ ≤ ২ [১ পয়েন্ট], ২ ≤ ৩ [১ পয়েন্ট], ৪ ≤ ৪ [১ পয়েন্ট]।

আমাদের সেই K বের করতে হবে যাতে সর্বোচ্চ স্কোর পাওয়া যায়। একাধিক উত্তর থাকলে সবচেয়ে ছোট K রিটার্ন করুন।

সমাধানের ধাপসমূহ

  • ret := 0, n := A.size()
  • n আকারের একটি cnt অ্যারে সংজ্ঞায়িত করুন
  • i := 0 থেকে n-1 পর্যন্ত লুপ চালান
    • যদি A[i] <= i হয়
      • minI := 0, cnt[minI]++
      • maxI := i - A[i]
      • যদি maxI + 1 < n হয়, cnt[maxI + 1]--
      • যদি i + 1 < n হয়, cnt[i + 1]++
    • অন্যথায়
      • যদি A[i] >= n হয়, continue
      • minI := i + 1, cnt[minI]++
      • maxi := i + (n - A[i])
      • যদি maxi + 1 < n হয়, cnt[maxi + 1]--
  • maxCnt := -1, temp := 0
  • i := 0 থেকে n-1 পর্যন্ত
    • temp += cnt[i]
    • যদি temp > maxCnt হয়, maxCnt := temp, ret := i
  • ret রিটার্ন করুন

উদাহরণ

#include <bits/stdc++.h> using namespace std; class Solution { public:    int bestRotation(vector<int>& A) {       int ret = 0;       int n = A.size();       vector <int> cnt(n);       for(int i = 0; i < n; i++){          if(A[i] <= i){             int minI = 0;             cnt[minI]++;             int maxI = i - A[i];             if(maxI + 1 < n) cnt[maxI + 1]--;             if(i + 1 < n) cnt[i + 1]++;          }else{             if(A[i] >= n) continue;             int minI = i + 1;             cnt[minI]++;             int maxi = i + (n - A[i]);             if(maxi + 1 < n)cnt[maxi + 1]--;          }       }       int maxCnt = -1;       int temp = 0;       for(int i = 0; i < n; i++){          temp += cnt[i];          if(temp > maxCnt){             maxCnt = temp;             ret = i;          }       }       return ret;    } }; main(){    Solution ob;    vector<int> v = {2,3,1,5,1};    cout << (ob.bestRotation(v)); }

ইনপুট

[2,3,1,5,1]

আউটপুট

3
  1. C++-এ এক্সপ্রেশন ট্রি (Expression Tree) উদাহরণসহ

  2. C++-এ একটি পয়েন্টকে অন্য পয়েন্টের সাপেক্ষে ঘুরানো (Rotation)

  3. C++-এ ৩n স্লাইস পিজা (Pizza With 3n Slices)

  4. C++-এ সবচেয়ে গভীর নোডগুলো ধারণকারী ছোটতম সাবট্রি