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

C++で同じ製品を持つタプル


異なる要素を含む整数の配列があるとしましょう。タスクは、すべて同じ製品を持つようにタプルの総数を数えることです。

タプルが(a、b、c、d)の場合、このタプルが続く場合は有効です(a * b =c * d)。たとえば、

入力-1

arr[]= {2,4,6,3}

出力

8

説明:タプルの総数は8であり、これらは(2 6 3 4)、(2,6,4,3)、(6,2,3,4)、(6,2,4,3)、( 3,4,2,6)、(4,3,2,6)、(3,4,6,2)、(4,3,6,2)ここで、a * b =c*d。

この問題を解決するためのアプローチ-

この問題を解決するためのアイデアは、ペアのすべての乗算にハッシュマップを使用することです。

これは、マップに保存されているすべてのペアが同じ乗算を持つようにするのに役立ちます。

指定された配列内のすべての要素の乗算のマップを作成した後、マップをトラバースして、(a * b =c * d)の形式で同じ乗算を持つペアがいくつあるかを確認します。

ペアの総数はn*(n-1)/ 2として数えることができ、1つのペアには、最大4*2のそのような順列を持つことができる「4」の数があります。したがって、すべての要素について、その中にn *(n1)/ 2*8ペアを含めることができます。

  • 配列要素を入力します。

  • 整数関数countTuples(int * arr、int n)は、配列要素とそのサイズを入力として受け取ります。そして、同じ積を持つタプルの数を(a * b =c * d)の形式で返します。

  • キーがペアの積であり、値がそれらのペアの頻度であるようなハッシュマップを作成します。

  • マップを繰り返し、同じ製品を持つそのようなタプルの数を数えます。

#include <bits/stdc++.h>
using namespace std;
int countTuple(int *arr, int n) {
   map<int, int> mp;
   for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++)
         mp[arr[i] * arr[j]]++;
   int ans = 0;
   for (auto it : mp)
      ans += (it.second * (it.second - 1) / 2) * 8;
   return ans;
}
int main(){
   int n=4;
   int arr[n]= {2,4,6,3};
   int res= countTuple(arr,n);
   cout<<res<<" ";
   return 0;
}

出力

8

同じ製品タプルを持つすべてのタプルは8です。


  1. C++のMazeIII

    空のスペースと壁のある迷路があり、その迷路の中にボールもあるとします。ボールは、上(u)、下(d)、左(l)、または右(r)の方向に転がることで空きスペースを通過できますが、壁にぶつかるまで転がり続けます。ボールが止まると、次の方向を選ぶことができます。その迷路にも1つの穴があります。ボールが穴に転がると、ボールは穴に落ちます。 したがって、ボールの位置、穴の位置、迷路がある場合、最短距離を移動することでボールがどのように穴に落ちるかを調べる必要があります。ここで、距離は、ボールがスタート(除外)からホール(含まれる)まで移動した空きスペースの数によって定義されます。 「u」、「d」、「l

  2. Pythonで同じ製品のタプルを見つけるプログラム

    一意の正の値を持つ配列numがあるとすると、a * b =c * dとなるタプル(a、b、c、d)の数を見つける必要があります。ここで、a、b、c、およびdはnumの要素です。 、およびすべての要素a、b、c、およびdは別個のものです。 したがって、入力がnums =[2,3,4,6]のような場合、(2,6,3,4)、(2,6,4,3)のようなタプルを取得できるため、出力は8になります。 、(6,2,3,4)、(6,2,4,3)、(3,4,2,6)、(4,3,2,6)、(3,4,6,2) 、(4,3,6,2)。 これを解決するには、次の手順に従います- dic:=空のマップ。キーが存在