Pythonでn人が反転したライトの数をカウントするプログラム
番号がnで、部屋にn個のトグルスイッチがあり、その部屋にn人がいるとすると、次のようにスイッチを切り替えます-
- 人1が来て、すべてのスイッチを切り替えます。
- Person 2が来て、2:2、4、6、...の倍数のスイッチを切り替えます。
- 人iが来て、iの倍数のスイッチを切り替えます。など。
最終的にオンの位置にあるスイッチの数を見つける必要があります。
したがって、入力がn =5の場合、最初の電球は[0、0、0、0、0]であるため、出力は2になります。
- プレーヤー1の後:[1、1、1、1、1]
- プレーヤー2の後:[1、0、1、0、1]
- プレーヤー3の後:[1、0、0、0、1]
- プレーヤー4の後:[1、0、0、1、1]
- プレーヤー5の後:[1、0、0、1、0]
最後に2つのライトがオン状態になっています
これを解決するには、次の手順に従います-
- l:=0
- r:=n
- l <=rの場合、do
- mid:=l +(r --l)/2のフロア
- mid * mid <=n <(mid + 1)^ 2の場合、
- 途中で戻る
- それ以外の場合、n
- r:=mid
- それ以外の場合、
- l:=mid + 1
例
理解を深めるために、次の実装を見てみましょう-
def solve(n): l, r = 0, n while l <= r: mid = l + (r - l) // 2 if mid * mid <= n < (mid + 1) * (mid + 1): return mid elif n < mid * mid: r = mid else: l = mid + 1 n = 5 print(solve(n))
入力
5
出力
2
-
PythonでnノードのBSTの数をカウントするプログラム
n個の異なるノードがあるとします。すべてが異なります。二分探索木を形成するためにそれらを配置できる方法の数を見つける必要があります。二分探索木で知っているように、左側のサブツリーは常に小さい値を保持し、右側のサブツリーは大きい値を保持します。 これを解決するために、カタラン数を見つけます。カタラン数C(n)は、n個の異なるキーを持つ二分探索木を表します。式は次のようになります $$ C(n)=\ frac {(2n)!} {(n + 1)!\ times n!} $$ したがって、入力がn =3の場合、出力は5になります。 これを解決するには、次の手順に従います- 関数ncr
-
Pythonで合計がkであるパスの数をカウントするプログラム
二分木と別の値kがあるとすると、合計がkになるサブ子パスへの一意のノードの数を見つける必要があります。 したがって、入力が次のような場合 k =5の場合、パスは[2、3]と[1、4] であるため、出力は2になります。 これを解決するには、次の手順に従います- count:=マップは最初にキー0の値1を保持します ans:=0、プレフィックス:=0 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 プレフィックス:=プレフィックス+ノードの値 ans:=ans +(count [prefix --target]、これが利用できない場合は0にな