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

จำนวนลูกศรขั้นต่ำที่จะระเบิดลูกโป่งใน C++


สมมติว่ามีบอลลูนทรงกลมจำนวนไม่มากกระจายอยู่ในพื้นที่สองมิติ สำหรับบอลลูนแต่ละลูก จะมีพิกัดเริ่มต้นและจุดสิ้นสุดของเส้นผ่านศูนย์กลางแนวนอน จุดเริ่มต้นเล็กกว่าจุดสิ้นสุดเสมอ จะมีไม่เกิน 104 ลูกโป่ง ลูกศรหนึ่งลูกสามารถยิงขึ้นในแนวตั้งได้อย่างแม่นยำจากจุดต่างๆ ตามแนวแกน x บอลลูนที่มีตำแหน่ง xstart ถึง xend ระเบิดด้วยลูกศรที่ยิงไปที่ x ถ้า xstart =x =xend ไม่จำกัดจำนวนลูกธนูที่สามารถยิงได้ สมมติให้ลูกธนูหนึ่งลูกพุ่งขึ้นไปอย่างไม่สิ้นสุด เราต้องหาจำนวนลูกศรขั้นต่ำที่ต้องยิงเพื่อระเบิดลูกโป่งทั้งหมด ดังนั้นหากอินพุตเป็นเหมือน [[10,16],[2,8], [1,6], [7,12]] ผลลัพธ์จะเป็น 2 ดังนั้นหากเรายิงจาก x =6 มันก็จะ จะระเบิด [2,8] และ [1,6] และบอลลูนอีกอันจาก x =11 เพื่อระเบิดส่วนที่เหลือ

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

  • กำหนดวิธีการที่เรียกว่า intersect() เพื่อตรวจสอบว่าตำแหน่งตัดกันหรือไม่

  • อีกวิธีหนึ่ง manipulate() เพื่อจัดการพิสัยหลังจากหาพิสัยของบอลลูนที่ตัดกันทั้งหมด

  • วิธีที่แท้จริงคือการวางตำแหน่งบอลลูนเป็น pos

  • จัดเรียงอาร์เรย์ pos ตามตำแหน่งสิ้นสุด

  • n :=จำนวนลูกโป่ง ถ้า n เป็น 0 ให้คืนค่า 0

  • currEnd :=ตำแหน่งสิ้นสุดของรายการแรกของ pos หลังจาก soring

  • cnt :=1

  • สำหรับฉันอยู่ในช่วง 1 ถึง n – 1

    • ถ้า currEnd <ตำแหน่งเริ่มต้นของ pos[i] ให้เพิ่มจำนวนขึ้น 1 และ currEnd :=ตำแหน่งสิ้นสุดของ pos[i]

  • จำนวนคืน

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool intersect(vector <int>& a, vector <int>& b){
      return a[1] >= b[0];
   }
   static bool cmp(vector <int>& a, vector <int>& b){
      return a[1] < b[1];
   }
   void manipulate(vector <int>& a, vector <int>& b){
      a[0] = min(a[0], b[0]);
      a[1] = max(a[1], b[1]);
   }
   int findMinArrowShots(vector<vector<int>>& points) {
      sort(points.begin(), points.end(), cmp);
      int n = points.size();
      if(!n) return 0;
      int currEnd = points[0][1];
      int cnt = 1;
      for(int i = 1; i < n; i++){
         if(currEnd < points[i][0]){
            cnt++;
            currEnd = points[i][1];
         }
      }
      return cnt;
   }
};
main(){
   vector<vector<int>> v = {{10,16},{2,8},{1,6},{7,12}};
   Solution ob;
   cout << (ob.findMinArrowShots(v));
}

อินพุต

[[10,16],[2,8],[1,6],[7,12]]

ผลลัพธ์

2