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

การเคลื่อนหินจนเรียงติดกัน II ใน C++


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

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

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

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

เช่น ถ้าอินพุตเป็น [7,3,9] ผลลัพธ์จะเป็น [1,3]

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

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

  • ans[0] := inf, ans[1] := -inf และ n := ขนาดของ a

  • เรียงอาร์เรย์ a

  • x := 1

  • ทำซ้ำ while x < n และ a[x] - a[x-1] เท่ากับ 1 ให้เพิ่ม x ขึ้น 1

  • ถ้า x เท่ากับ n ให้คืนค่า {0,0}

  • minVal := 0, j := 1

  • ลูป i จาก 0 ถึง a.size()-1:

    • curr := a[i], lastPossible = a[i] + n - 1

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

    • spaceInBetween := false

    • ถ้า j <= i ให้ j := i + 1

    • ทำซ้ำ while j < n และ a[j] <= lastPossible:

      • ถ้า (a[j] - a[j-1]) > 1 ให้ spaceInBetween := true

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

    • idx := j - 1

    • ถ้า n - (idx - i + 1) > 1 ให้ spaceInBetween := true

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

    • minVal := ballLeft + ballRight + (0 ถ้า spaceInBetween จริง มิฉะนั้น 1)

    • ans[0] := min ของ minVal และ ans[0]

    • ans[1] := max ของ (a[n-2] - a[0]) และ (a[n-1] - a[1]) - (n - 2)

    • คืนค่า ans

  • จากเมธอดหลัก เรียก solve(stones)

ตัวอย่าง

#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, ]