2つの配列を同じにするための操作の数をカウントするC++コード
n個の要素を持つ2つの配列AとBがあるとします。操作について考えてみます。2つのインデックスiとjを選択し、i番目の要素を1減らし、j番目の要素を1増やします。操作を実行した後、配列の各要素は非負である必要があります。 AとBsameを作りたいです。 AとBを同じにするための操作のシーケンスを見つける必要があります。不可能な場合は、-1を返します。
したがって、入力がA =[1、2、3、4]のような場合; B =[3、1、2、4]の場合、出力は[(1、0)、(2、0)]になります。これは、i=1およびj=0の場合、配列は[2、1、3 、4]の場合、i=2およびj=0の場合、[3、1、2、4]
になります。ステップ
これを解決するには、次の手順に従います-
a := 0, b := 0, c := 0 n := size of A Define an array C of size n and fill with 0 for initialize i := 0, when i < n, update (increase i by 1), do: a := a + A[i] for initialize i := 0, when i < n, update (increase i by 1), do: b := b + A[i] if a is not equal to b, then: return -1 Otherwise for initialize i := 0, when i < n, update (increase i by 1), do: c := c + |A[i] - B[i]| C[i] := A[i] - B[i] c := c / 2 i := 0 j := 0 while c is non-zero, decrease c after each iteration, do: while C[i] <= 0, do: (increase i by 1) while C[j] >= 0, do: (increase j by 1) print i and j decrease C[i] and increase C[j] by 1
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; void solve(vector<int> A, vector<int> B){ int a = 0, b = 0, c = 0; int n = A.size(); vector<int> C(n, 0); for (int i = 0; i < n; i++) a += A[i]; for (int i = 0; i < n; i++) b += A[i]; if (a != b){ cout << -1; return; } else{ for (int i = 0; i < n; i++){ c += abs(A[i] - B[i]); C[i] = A[i] - B[i]; } c = c / 2; int i = 0, j = 0; while (c--){ while (C[i] <= 0) i++; while (C[j] >= 0) j++; cout << "(" << i << ", " << j << "), "; C[i]--, C[j]++; } } } int main(){ vector<int> A = { 1, 2, 3, 4 }; vector<int> B = { 3, 1, 2, 4 }; solve(A, B); }
入力
{ 1, 2, 3, 4 }, { 3, 1, 2, 4 }
出力
(1, 0), (2, 0),
-
サイズdで作成できる十二角形の数をカウントするC++プログラム
数dがあるとします。正方形のタイルと辺の長さが1の通常の三角形のタイルが無数にあると考えてください。これらのタイルを使用して、側面dの通常の十二角形(12辺の多角形)を形成できる方法をいくつ見つける必要があります。答えが大きすぎる場合は、結果mod998244353を返します。 ステップ これを解決するために、次の手順に従います- b := floor of d/2 - 1 c := 1 for initialize i := 2, when i < d, update (increase i by 1), do: b := b * (floor of
-
C++を使用して2つの文字列を等しくするために必要な特定の操作の最小数。
問題の説明 2つの文字列str1とstr2がある場合、両方の文字列に文字「a」と「b」が含まれます。両方の文字列は同じ長さです。両方の文字列に1つの_(空のスペース)があります。タスクは、次の操作の最小数を実行することにより、最初の文字列を2番目の文字列に変換することです- _が位置Iにある場合、_は位置i+1またはi-1の文字と交換できます 位置i+1とi+2の文字が異なる場合、_は位置i+1またはi+2の文字と交換できます 同様に、位置i-1とi-2の文字が異なる場合、_は位置i-1またはi-2の文字と交換できます str1 =“ aba_a”およびstr2 =“