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

Di chuyển các viên đá cho đến khi liên tiếp II trong C ++

Giả sử chúng ta đang xem xét một dãy số vô hạn, ở đây vị trí của viên đá thứ i được cho bởi các viên đá mảng và viên đá [i] là vị trí của viên đá thứ i. Một viên đá là một viên đá điểm cuối nếu nó có vị trí nhỏ nhất hoặc lớn nhất. Bây giờ trong mỗi lượt, chúng tôi nhặt một viên đá điểm cuối và di chuyển nó đến vị trí không có người để nó không còn là viên đá điểm cuối nữa.

Nếu các viên đá ở vị trí nói trên, stone =[1,2,5], chúng tôi không thể di chuyển viên đá điểm cuối ở vị trí 5, bởi vì việc di chuyển nó đến bất kỳ vị trí nào (chẳng hạn như 0, hoặc 3) sẽ vẫn giữ viên đá đó làm viên đá điểm cuối. .

Trò chơi này sẽ dừng lại khi chúng ta không thể thực hiện thêm động tác nào nữa. Vì vậy, các viên đá ở vị trí liên tiếp.

Ở đây chúng ta phải tìm khi trò chơi kết thúc, vậy số lượng nước đi tối thiểu và tối đa mà chúng ta có thể thực hiện là bao nhiêu? Tìm câu trả lời dưới dạng một cặp [min_moves, max_moves]

Ví dụ:nếu đầu vào là [7,3,9], thì kết quả sẽ là [1,3]

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

  • Xác định ans mảng có kích thước 2

  • ans [0]:=inf, ans [1]:=−inf và n:=kích thước của a

  • sắp xếp mảng a

  • x:=1

  • trong khi x

    • tăng x 1

  • nếu x giống với n thì

    • trả lại một cặp {0,0}

  • minVal:=0, j:=1

  • để khởi tạo i:=0, khi i

    • curr:=a [i], lastPossible =a [i]

    • nếu lastPossible> a [n - 1], thì hãy ra khỏi vòng lặp

    • spaceInBetween:=false

    • nếu j <=i, thì,

      • j:=i + 1

    • while j

      • nếu a [j] - a [j - 1])> 1, thì

        • spaceInBetween:=true

      • nếu a [j] - a [j - 1])> 1, thì

      • tăng j lên 1

    • idx:=j - 1

    • nếu n - (idx - i + 1)> 1, thì

      • spaceInBetween:=true

  • ballLeft:=i, ballRight:=n - (idx + 1)

  • minVal:=ballLeft + ballRight + (0 khi spaceInBetween là true, ngược lại là 1)

  • ans [0]:=tối thiểu minVal ans ans [0]

  • ans [1]:=max của a [n - 2] - a [0] và a [n - 1] - a [1]) - (n - 2),

  • trả lại ans

  • từ phương thức chính, hãy gọi giải quyết (stone)

Ví dụ

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> solve(vector<int> a) {
      vector <int> ans(2);
      ans[0] = INT_MAX;
      ans[1] = INT_MIN;
      int n = a.size();
      sort(a.begin(), a.end());
      int x = 1;
      while(x < n && a[x] - a[x - 1] == 1)
         x ++;
      if(x == n){
         return {0,0};
      }
      int minVal = 0;
      int j = 1;
      for(int i = 0; i < a.size(); i++){
         int curr = a[i];
         int lastPossible = a[i] + n - 1;
         if(lastPossible > a[n - 1])
            break;
         bool spaceInBetween = false;
         if(j <= i)
            j = i + 1;
            while(j < n && a[j] <= lastPossible){
               if((a[j] - a[j - 1]) > 1) {
                  spaceInBetween = true;
               }
               j++;
            }
           int idx = j - 1;
           if(n - (idx - i + 1) > 1)
              spaceInBetween = true;
           int ballLeft = i;
           int ballRight = n - (idx + 1);
           minVal = ballLeft + ballRight + (spaceInBetween? 0 : 1);
           ans[0] = min(minVal, ans[0]);
        }
       ans[1] = max(a[n - 2] - a[0], a[n - 1] - a[1]) - (n -2);
       return ans;
   }
   vector<int> numMovesStonesII(vector<int>& stones) {
      return solve(stones);
   }
};
main(){
   Solution ob;
   vector<int> v1 = {7,3,9};
   print_vector(ob.numMovesStonesII(v1));
}

Đầu vào

[7,3,9]

Đầu ra

[1, 3, ]