Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ย้ายหินจนกว่าจะติดต่อกัน II ใน C ++


สมมติว่าเรากำลังพิจารณาเส้นจำนวนอนันต์ ที่นี่ตำแหน่งของหินที่ i ถูกกำหนดโดยหินอาร์เรย์ และหิน[i] แสดงถึงตำแหน่งของหิน หินเป็นหินปลายทางหากมีตำแหน่งที่เล็กที่สุดหรือใหญ่ที่สุด ในแต่ละเทิร์น เราหยิบหินเอ็นด์พอยท์และย้ายไปยังตำแหน่งที่ว่างเพื่อไม่ให้เป็นหินเอ็นด์พอยท์อีกต่อไป

หากหินอยู่ที่ตำแหน่ง กล่าวคือ หิน =[1,2,5] เราไม่สามารถย้ายหินจุดสิ้นสุดที่ตำแหน่ง 5 ได้ เนื่องจากการย้ายไปยังตำแหน่งใดๆ (เช่น 0 หรือ 3) จะยังคงเก็บหินนั้นเป็นหินปลายทาง .

เกมนี้จะหยุดเมื่อเราไม่สามารถเคลื่อนไหวได้อีกต่อไป ดังนั้นหินจึงอยู่ในตำแหน่งที่ต่อเนื่องกัน

ที่นี่เราต้องค้นหาเมื่อเกมจบลง ดังนั้นจำนวนการเคลื่อนไหวขั้นต่ำและสูงสุดที่เราสามารถทำได้คืออะไร? หาคำตอบเป็นคู่ [min_moves, max_moves]

ตัวอย่างเช่น หากอินพุตเป็น [7,3,9] ผลลัพธ์จะเป็น [1,3]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดอาร์เรย์ขนาด 2

  • ans[0] :=inf, ans[1] :=−inf and n :=size of a

  • จัดเรียงอาร์เรย์ a

  • x :=1

  • ในขณะที่ x

    • เพิ่ม x ขึ้น 1

  • ถ้า x เท่ากับ n แล้ว

    • ส่งคืนคู่ {0,0}

  • minVal :=0, j :=1

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

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

    • ถ้า lastPossible> a[n - 1] แล้ว ให้ออกมาจากลูป

    • spaceInBetween :=เท็จ

    • ถ้า j <=i แล้ว

      • เจ :=ผม + 1

    • ในขณะที่ j

      • ถ้า a[j] - a[j - 1])> 1 แล้ว

        • spaceInBetween :=จริง

      • ถ้า a[j] - a[j - 1])> 1 แล้ว

      • เพิ่มขึ้น 1

    • idx :=j - 1

    • ถ้า n - (idx - i + 1)> 1 แล้ว

      • spaceInBetween :=จริง

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

  • minVal :=ballLeft + ballRight + (0 เมื่อ spaceInBetween เป็นจริง มิฉะนั้น 1)

  • ans[0] :=ขั้นต่ำของ minVal ans[0]

  • ans[1] :=สูงสุดของ a[n - 2] - a[0] และ a[n - 1] - a[1]) - (n - 2),

  • กลับมาอีกครั้ง

  • จากเมธอดหลัก เรียก แก้(หิน)

ตัวอย่าง

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

อินพุต

[7,3,9]

ผลลัพธ์

[1, 3, ]