与えられた制約で行列の最後の値を見つけるC++プログラム
N個の要素を含む数Aのリストがあるとします。要素は1、2、または3です。数X [1] [j] =A [j]を考えます。ここで、jは1からNの範囲です。X[i] [j] =| X [i-1] [ j]-X [i-1] [j + 1] |ここで、iは2からNの範囲にあり、jは1からN+1-iの範囲にあります。 X[i][j]の値を見つける必要があります。
したがって、入力がA =[1,2,3,1]の場合、出力は1になります。
X[1][1] to X[1][4] are 1, 2, 3, 1 X[2][1], X[2][2], X[2][3] are |1-2| = 1, |2 - 3| = 1 and |3 - 1| = 2 X[3][1], X[3][2] are ∣ 1 − 1∣ = 0, ∣ 1 − 2∣ = 1. X[4][1] = |0 - 1| = 1 So the answer is 1
これを解決するには、次の手順に従います-
Define a function calc(), this will take N, M,
cnt := 0
for initialize k := N, when k is non-zero, update k >>= 1, do:
cnt := floor of (cnt + k)/2
for initialize k := M, when k is non-zero, update k >>= 1, do:
cnt := floor of (cnt - k)/2
for initialize k := N - M, when k is non-zero, update k >>= 1, do:
cnt := floor of (cnt - k)/2
return invert of cnt
From the main method, do the following
n := size of A
Define an array arr of size (n + 1)
for initialize i := 1, when i < n, update (increase i by 1), do:
arr[i - 1] = |A[i] - A[i - 1]|
(decrease n by 1)
hh := 1, pd := 0, ck := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
if arr[i] is non-zero, then:
if arr[i] is same as 1, then:
hh := 0
pd := pd XOR calc(n - 1, i)
Otherwise
ck := ck XOR calc(n - 1, i)
ck := ck AND hh
if pd XOR ck is non-zero, then:
return "1" + hh
return "0" 例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
int calc(int N, int M) {
int cnt = 0;
for (int k = N; k; k >>= 1)
cnt += k >> 1;
for (int k = M; k; k >>= 1)
cnt -= k >> 1;
for (int k = N - M; k; k >>= 1)
cnt -= k >> 1;
return !cnt;
}
string solve(vector<int> A) {
int n = A.size();
vector<int> arr(n + 1);
for (int i = 1; i < n; i++) {
arr[i - 1] = abs(A[i] - A[i - 1]);
}
--n;
bool hh = 1, pd = 0, ck = 0;
for (int i = 0; i < n; i++)
if (arr[i]) {
if (arr[i] == 1)
hh = 0, pd ^= calc(n - 1, i);
else
ck ^= calc(n - 1, i);
}
ck &= hh;
if (pd ^ ck)
return "1" + hh;
return "0";
}
int main(){
vector<int> A = { 1, 2, 3, 1 };
cout << solve(A) << endl;
} 入力
{ 1, 2, 3, 1 } 出力
1
-
C++で指定された値を持つ葉を削除する
二分木と整数のターゲットがあるとすると、値のターゲットを持つすべてのリーフノードを削除する必要があります。親ノードがリーフノードになり、値ターゲットを持つ場合、値ターゲットを持つリーフノードを削除すると、それも削除する必要があることに注意する必要があります(できなくなるまでそれを続ける必要があります)。したがって、ツリーが以下のようになり、ターゲットが2の場合、最終的なツリーは最後のツリーのようになります- これを解決するには、次の手順に従います- remLeaf()と呼ばれる再帰メソッドを定義します。これにより、ルートとターゲットが取得されます ルートがnullの場合、n
-
文字のASCII値を検索するC++プログラム
ASCII(情報交換のためのアメリカ標準コード)テーブルには、0から127の範囲の値を持つ128文字があります。 異なる文字のASCII値のいくつかは次のとおりです- 文字 ASCII値 A 65 a 97 Z 90 z 122 $ 36 & 38 ? 63 文字のASCII値を見つけるプログラムは次のとおりです- 例 #include <iostream> using namespace std; void printASCII(char c) { int i