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

C++のブラックリストを使用したランダムピック


Bというブラックリストがあるとします。これは範囲[0、N)から一意の整数を保持しているため、範囲[0、N)からBにない均一なランダム整数を返す関数を定義する必要があります。 random()を減らすことにより、この関数をより最適化します。関数呼び出し。入力配列が次のようであると仮定します

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

1つのマップを定義する

  • Nと配列vで初期化します。
  • iを初期化する場合:=0、i
  • if v [i]
  • M:=N –mのサイズ
  • n:=vのサイズ
  • iを初期化する場合:=0、i
  • v [i]
  • Nを1減らします
  • Nがmの場合、-
      を実行します。
    • Nを1減らします
  • m [v [i]]:=N
  • 関数pick()を定義する
  • x:=乱数mod M
  • return(xがmに存在する場合は、m [x]、それ以外の場合はx)
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int M;
       map <int,int> m;
       Solution(int N, vector<int>& v) {
          for(int i = 0; i < v.size(); i++){
             if(v[i] < N) m[v[i]] = -1;
          }
          M = N - (int)(m.size());
          int n = v.size();
          for(int i = 0; i < v.size(); i++){
             if(v[i] < M){
                while(m.count(--N));
                m[v[i]] = N;
             }
          }
       }
       int pick() {
          int x = rand() % M;
          return m.count(x)? m[x] : x;
       }
    };
    main(){
       vector<int> v = {2};
       Solution ob(4,v);
       cout << (ob.pick()) << endl;
       cout << (ob.pick()) << endl;
       cout << (ob.pick()) << endl;
    }

    入力

    Give N = 4 and array [2]

    出力

    1
    1
    0

    1. C++での例を含む式ツリー

      式ツリーは、ツリーの各ノードが演算子またはオペランドで構成される特殊なタイプの二分木です。 リーフノード ツリーのオペランドを表します 。 非リーフノード ツリーの演算子を表します 。 例: 簡単に解決できる中置式を取得するには、順序トラバーサルを使用してツリーをトラバースする必要があります。

    2. C++で3nスライスのピザ

      さまざまなサイズの3nスライスのピザがあるとすると、私と2人の友人は次のようにピザのスライスを取ります- ピザのスライスを選びます。 友達のアマルが私のピックの反時計回りに次のスライスをピックします。 友達のBimalが、私のピックの時計回りに次のスライスをピックします。 ピザのスライスがなくなるまで、これらの手順を繰り返します。 ピザスライスのサイズは、時計回りの円形配列スライスで表されます。可能な最大のスライスサイズの合計を見つける必要があります。 したがって、入力が[9,8,6,1,1,8]のような場合、 次に、各ターンでサイズ8のピザスライスを選