C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でK番目に小さい素数の分数


ソートされたリストが1つあり、1つといくつかの素数があるとします。ここで、リスト内のすべてのp

したがって、入力が[1,3,5,7]のようで、k =2の場合、分数は1 / 3、1 / 5、1 / 7、3 / 5であるため、答えは1/5になります。 3 / 7、5 / 7、2番目に小さいのは1/5です。

これを解決するには、次の手順に従います-

  • データを定義します。これにはa、b、a/bが必要です
  • サイズ2の配列retを定義します
  • n:=Aのサイズ
  • 1つの優先キューpqを定義する
  • iを初期化する場合:=0、i
  • Data(A [0]、A [i]、0)をpqに挿入します
  • Kがゼロ以外の場合、-
      を実行します。
    • temp=pqの最上位要素
    • pqから要素を削除する
    • Kが0と同じ場合、-
      • ret [0]:=a of temp
      • ret [1]:=b of temp
      • return ret
    • temp.idx + 1
    • idx:=temp+1のidx
    • Data(A [idx]、temp.b、idx)をpqに挿入します
  • Kを1減らします
  • return ret
  • 理解を深めるために、次の実装を見てみましょう-

    #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, ]

    1. C++のビット単位のふるい

      この問題では、数値Nが与えられます。私たちのタスクは、ビット単位のふるいを使用して、Nよりも小さいすべての素数を見つけることです。 ビット単位のふるいは、エラトステネスのふるいの最適化されたバージョンであり、指定された数よりも小さいすべての素数を見つけるために使用されます。 問題を理解するために例を見てみましょう 入力 − n =25 出力 − 2 3 5 7 11 13 17 19 23 ビット単位のふるいは、通常のふるいと同じように機能します。ブール型の代わりに、素数を表す整数のビットを使用します。これにより、スペースの複雑さが1/8倍に減少します。 例 解決策を理解するた

    2. C ++のBST(BSTの順序統計量)でk番目に小さい要素を検索します

      二分探索木があり、入力として値Kがあるとすると、ツリー内でK番目に小さい要素を見つける必要があります。 したがって、入力が次のような場合 k =3の場合、出力は15になります。 これを解決するには、次の手順に従います- 関数find_kth_smallest()を定義します。これは、root、count、k、を取ります。 ルートがNULLの場合、- NULLを返す left =find_kth_smallest(rootの左側、カウント、k) leftがNULLでない場合、- 左に戻る (カウントを1つ増やします) count