C++でx^y> y ^ xとなる配列内のペア(x、y)の数を見つけます
正の整数の2つの配列XとYがあるとします。 x ^ y> y ^ xとなるペアの数を見つけます。ここで、xはXの要素であり、yはYの要素です。X=[2、1、6]、およびY =[1、5]と仮定します。 、出力は3になります。3つのペアがあるため、これらは(2、1)、(2、5)、および(6、1)です
これを効率的に解決できます。ロジックは単純です。いくつかの例外を除いて、y> x、x ^ y> y^xの場合になります。これがトリックです。
-
配列Yを並べ替える
-
Xの各要素xについて、Yのxより大きい最小数のインデックスを見つける必要があります。これを行うには、二分探索を使用します。それ以外の場合は、upper_bound()関数も使用できます。
-
見つかったインデックスの後のすべての数値は関係を満たしているので、それをカウントに追加するだけです。
例
#include <iostream> #include <algorithm> using namespace std; int count(int x, int Y[], int n, int no_of_y[]) { if (x == 0) return 0; if (x == 1) return no_of_y[0]; int* index = upper_bound(Y, Y + n, x); int ans = (Y + n) - index; ans += (no_of_y[0] + no_of_y[1]); if (x == 2) ans -= (no_of_y[3] + no_of_y[4]); if (x == 3) ans += no_of_y[2]; return ans; } int howManyPairs(int X[], int Y[], int m, int n) { int no_of_y[5] = {0}; for (int i = 0; i < n; i++) if (Y[i] < 5) no_of_y[Y[i]]++; sort(Y, Y + n); int total_pairs = 0; for (int i=0; i< m; i++) total_pairs += count(X[i], Y, n, no_of_y); return total_pairs; } int main() { int X[] = {2, 1, 6}; int Y[] = {1, 5}; int m = sizeof(X)/sizeof(X[0]); int n = sizeof(Y)/sizeof(Y[0]); cout << "Total pair count: " << howManyPairs(X, Y, m, n); }
出力
Total pair count: 3
-
C++を使用してすべての要素が割り切れるような配列要素を見つけます
要素が少ない配列Aがあるとします。すべての要素をそれで分割できるように、Aから要素を見つける必要があります。 Aが[15、21、69、33、3、72、81]のようであるとすると、すべての数値は3で割り切れる可能性があるため、要素は3になります。 この問題を解決するために、Aの最小の数値を取得し、すべての数値を最小の数値で除算できるかどうかを確認します。はいの場合は数値を返し、そうでない場合はfalseを返します。 例 #include<iostream> #include<algorithm> using namespace std; int getNumber(in
-
C ++でa%b =kとなるような配列内のすべてのペア(a、b)を検索します
配列Aがあるとすると、その配列から、a%b =kとなるようにすべてのペア(a、b)を取得する必要があります。配列がA=[2、3、4、5、7]、k =3であるとすると、ペアは(7、4)、(3、4)、(3、5)、(3、7)になります。 これを解決するために、リストをトラバースして、指定された条件が満たされているかどうかを確認します。 例 #include <iostream> using namespace std; bool displayPairs(int arr[], int n, int k) { bool pairAvilable = true;