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

ลดระยะทางสูงสุดไปยังปั๊มน้ำมันใน C++


สมมติว่าเรามีเส้นจำนวนแนวนอนหนึ่งเส้น บนเส้นจำนวนนั้น เรามีปั๊มน้ำมันที่ตำแหน่ง station[0], สถานี[1], ..., สถานี[N-1] โดยที่ N =ขนาดของอาร์เรย์สถานี ตอนนี้ เราเพิ่มสถานีบริการน้ำมัน K มากขึ้น เพื่อลดระยะห่างสูงสุดระหว่างสถานีบริการน้ำมันที่อยู่ติดกัน D เราต้องหาค่า D ที่น้อยที่สุดที่เป็นไปได้

ดังนั้น หากอินพุตเหมือนกับสถานี =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], K =9 เอาต์พุตจะเป็น 0.5

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

  • กำหนดฟังก์ชัน ok() ซึ่งจะใช้ x, array v

  • ยกเลิก :=0

  • สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ -

    • ret :=ret + เพดานของ (v[i + 1] - v[i]) / x

  • รีเทิร์น

  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −

  • ต่ำ :=0

  • n :=ขนาดของ s

  • สูง :=s[n - 1] - s[0]

  • ในขณะที่สูง - ต่ำ>=1e-6 ทำ -

    • กลาง :=(ต่ำ + สูง) / 2.0

    • x :=ok(กลาง, s)

    • ถ้า x> K แล้ว −

      • ต่ำ :=กลาง

    • มิฉะนั้น

      • สูง :=กลาง

  • ผลตอบแทนสูง

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int ok(double x, vector <int>& v){
      int ret = 0;
      for (int i = 0; i < v.size() - 1; i++) {
         ret += ceil((v[i + 1] - v[i]) / x) - 1;
      }
      return ret;
   }
   double minmaxGasDist(vector<int>& s, int K) {
      double low = 0;
      int n = s.size();
      double high = s[n - 1] - s[0];
      while (high - low >= 1e-6) {
         double mid = (low + high) / 2.0;
         int x = ok(mid, s);
         if (x > K) {
            low = mid;
         }
         else {
            high = mid;
         }
      }
      return high;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5,6,7,8,9,10};
   cout << (ob.minmaxGasDist(v, 9));
}

อินพุต

{1,2,3,4,5,6,7,8,9,10}, 9

ผลลัพธ์

0.5