Computer >> Máy Tính >  >> Lập trình >> C ++

Vòng quay nhỏ nhất với điểm cao nhất trong C ++

Giả sử chúng ta có một mảng A, chúng ta có thể xoay nó theo K để mảng trở thành A [K], A [K + 1], A {K + 2], ... A [A.length - 1], A [0], A [1], ..., A [K-1]. Khi đó, bất kỳ mục nhập nào nhỏ hơn hoặc bằng chỉ số của chúng đều có giá trị 1 điểm.

Vì vậy, ví dụ, chúng ta có một mảng [2, 4, 1, 3, 0], và chúng ta xoay K =2, nó sẽ trở thành [1, 3, 0, 2, 4]. Điều này có giá trị 3 điểm vì 1> 0 [không đạt được điểm], 3> 1 [không đạt được điểm], 0 <=2 [được một điểm], 2 <=3 [được một điểm], 4 <=4 [được một điểm].

Chúng ta phải tìm K để đạt điểm cao nhất. Nếu có nhiều câu trả lời, hãy trả về chỉ số nhỏ nhất như vậy K. Vì vậy, nếu đầu vào là K =2, thì câu trả lời sẽ là 5.

Vì vậy, nếu đầu vào là [2,3,1,5,1], thì đầu ra sẽ là 3, điều này là do -

K Mảng Điểm
0 [2,3,1,5,1] 2
1 [3,1,5,1,2] 3
2 [1,5,1,2,4] 3
3 [5,1,2,4,1] 4
4 [1,2,4,1,3] 3

Câu trả lời sẽ là 3.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • ret:=0
  • n:=kích thước của A
  • Xác định cnt mảng có kích thước n
  • để khởi tạo i:=0, khi i
  • nếu A [i] <=i, thì -
    • minI:=0, (tăng cnt [minI] lên 1)
    • maxI:=i - A [i]
    • nếu maxI + 1
    • cnt [maxI + giảm 1] xuống 1
  • nếu i + 1
  • cnt [i + tăng 1] lên 1
  • Mặt khác
    • nếu A [i]> =n, thì -
      • Bỏ qua phần sau, chuyển sang phần lặp tiếp theo
    • minI:=i + 1
    • (tăng cnt [minI] lên 1)
    • maxi:=i + (n - A [i])
    • nếu maxi + 1
    • cnt [maxi + giảm 1] đi 1
  • maxCnt:=-1, temp:=0
  • để khởi tạo i:=0, khi i
  • temp:=temp + cnt [i]
  • if temp> maxCnt, then -
    • maxCnt:=temp
    • ret:=i
  • trả lời lại
  • Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    Ví dụ

    #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));
    }

    Đầu vào

    [2,3,1,5,1]

    Đầu ra

    3