สมมติว่ามีรถ 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