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

K-th เศษส่วนไพร์มที่เล็กที่สุดใน C++


สมมติว่าเรามีรายการที่เรียงลำดับแล้ว มี 1 และจำนวนเฉพาะบางจำนวน ตอนนี้สำหรับทุก p

ดังนั้นหากอินพุตเป็น [1,3,5,7] และ k =2 คำตอบจะเป็น 1/5 เนื่องจากเศษส่วนคือ 1/3, 1/5, 1/7, 3/5 3/7, 5/7 ที่เล็กที่สุดเป็นอันดับสองคือ 1/5

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

  • กำหนดข้อมูล จะใช้ a, b และ a/b
  • กำหนดอาร์เรย์ ret ขนาด 2
  • n :=ขนาดของ A
  • กำหนดลำดับความสำคัญ pq หนึ่งคิว
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • แทรก Data(A[0], A[i], 0) ลงใน pq
  • ในขณะที่ K ไม่ใช่ศูนย์ ให้ทำ −
    • temp =องค์ประกอบด้านบนของ pq
    • ลบองค์ประกอบออกจาก pq
    • ถ้า K เท่ากับ 0 แล้ว −
      • ret[0] :=a ของอุณหภูมิ
      • ret[1] :=b ของอุณหภูมิ
      • คืนสินค้า
    • ถ้า temp.idx + 1
    • idx :=idx ของอุณหภูมิ + 1
    • แทรกข้อมูล (A[idx], temp.b, idx) ลงใน pq
  • ลด K ลง 1
  • คืนสินค้า
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #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;
    }
    struct Data{
       double val, a, b;
       int idx;
       Data(double a, double b, int c){
          val = a / b;
          this->a = a;
          this->b = b;
          idx = c;
       }
    };
    struct Comparator{
       bool operator()(Data a, Data b){
          return !(a.val < b.val);
       }
    };
    class Solution {
    public:
       vector<int> kthSmallestPrimeFraction(vector<int>& A, int K) {
          vector <int> ret(2);
          int n = A.size();
          priority_queue <Data, vector <Data>, Comparator> pq;
          for(int i = 0; i < n; i++){
             pq.push(Data(double(A[0]), double(A[i]), 0));
          }
          while(K--){
             Data temp = pq.top();
             pq.pop();
             if(K == 0){
                ret[0] = temp.a;
                ret[1] = temp.b;
                return ret;
             }
             if(temp.idx + 1 < n){
                int idx = temp.idx + 1;
                pq.push(Data(double(A[idx]), double(temp.b), idx));
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,3,5,7};
       print_vector(ob.kthSmallestPrimeFraction(v, 2));
    }

    อินพุต

    {1,3,5,7}
    2

    ผลลัพธ์

    [1, 5, ]