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

กองรถใน C++


สมมติว่ามีรถ N คันที่ไปยังจุดหมายเดียวกันตามถนนเลนเดียว ปลายทางคือ 'เป้าหมาย' ห่างออกไป ตอนนี้รถแต่ละคันมีค่าความเร็วคงที่ speed[i] (เป็นไมล์ต่อชั่วโมง) และตำแหน่งเริ่มต้นคือตำแหน่ง [i] ไมล์ไปยังเป้าหมายตลอดเส้นทาง

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

ดังนั้นหากเป้าหมายคือ 12 หากตำแหน่งคือ [10,8,0,5,3] และความเร็ว [2,4,1,1,3] ผลลัพธ์จะเป็น 3 เนื่องจากรถยนต์เริ่มต้นที่ 10 และ 8 กลายเป็นกองเรือพบกันตอน 12 โมง ตอนนี้รถที่เริ่มต้นที่ 0 นั้นไม่สามารถตามรถคันอื่นได้ดังนั้นจึงเป็นฝูงบินด้วยตัวมันเอง อีกครั้งที่รถที่เริ่มต้นที่ 5 และ 3 กลายเป็นกองเรือพบกันที่ 6

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

  • สร้างอาร์เรย์ v, n :=ขนาดของตำแหน่งอาร์เรย์ p
  • สำหรับ i ในช่วง 0 ถึง n – 1
    • แทรก (p[i], s[i]) ลงใน v
  • ret :=n
  • จัดเรียง v อาร์เรย์
  • กำหนดสแต็ก st
  • สำหรับ i ในช่วง 0 ถึง n – 1
    • temp :=(t – องค์ประกอบแรกของ v[i]) / องค์ประกอบที่สองของ v[i]
    • ในขณะที่ st ไม่ว่างและ stack top <=temp
      • ลดลง 1
      • ลบองค์ประกอบด้านบนออกจาก st
    • ใส่ temp ลงใน st
  • คืนสินค้า

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int carFleet(int t, vector<int>& p, vector<int>& s) {
      vector < pair <double, double> > v;
      int n = p.size();
      for(int i = 0; i < n; i++){
         v.push_back({p[i], s[i]});
      }
      int ret = n;
      sort(v.begin(), v.end());
      stack <double> st;
      for(int i = 0; i < n; i++){
         double temp = (t - v[i].first) / v[i].second;
         while(!st.empty() && st.top() <= temp){
            ret--;
            st.pop();
         }
         st.push(temp);
      }
      return ret;
   }
};
main(){
   vector<int> v1 = {10, 8, 0, 5, 3};
   vector<int> v2 = {2,4,1,1,3};
   Solution ob;
   cout << (ob.carFleet(12, v1, v2));
}

อินพุต

12
[10,8,0,5,3]
[2,4,1,1,3]

ผลลัพธ์

3