Computer >> Máy Tính >  >> Lập trình >> C ++

Phân số nguyên tố nhỏ nhất thứ K trong C ++

Giả sử chúng ta có một danh sách đã sắp xếp, có 1 và một số số nguyên tố, bây giờ với mọi p

Vì vậy, nếu đầu vào là [1,3,5,7] và k =2, thì câu trả lời sẽ là 1/5, vì các phân số là 1/3, 1/5, 1/7, 3/5, 3/7, 5/7, nhỏ thứ hai là 1/5.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định Dữ liệu, điều này sẽ lấy a, b và a / b
  • Xác định ret mảng có kích thước 2
  • n:=kích thước của A
  • xác định một hàng đợi ưu tiên pq
  • để khởi tạo i:=0, khi i
  • chèn Dữ liệu (A [0], A [i], 0) vào pq
  • trong khi K khác 0, do -
    • temp =phần tử hàng đầu của pq
    • xóa phần tử khỏi pq
    • nếu K giống 0, thì -
      • ret [0]:=tạm thời
      • ret [1]:=b of temp
      • trả lời lại
    • nếu temp.idx + 1
    • idx:=idx của temp + 1
    • chèn Dữ liệu (A [idx], temp.b, idx) vào pq
  • giảm K đi 1
  • trả lời lại
  • Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    Ví dụ

    #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));
    }

    Đầu vào

    {1,3,5,7}
    2

    Đầu ra

    [1, 5, ]