C++で複数の類似した数字を含むn未満の整数を見つけるプログラム
整数nがあるとすると、n以下の正の整数の数を見つける必要があります。ここで、整数には少なくとも1桁が複数回出現します。
したがって、入力がn =200のような場合、出力は38
になります。これを解決するには、次の手順に従います-
-
配列を定義する
-
初期化x:=nの場合、xがゼロ以外の場合、x:=x / 10を更新し、-
-
-
配列を反転しますa
-
ret:=n
-
初期化w:=1、d:=1の場合、w
-
d:=d * min(9、10 − w + 1)
-
ret:=ret − d
-
-
関数go()を定義します。これには議論はありません。
-
b:=(1ビット左シフト10)− 1
-
初期化i:=0の場合、i
-
初期化d:=i <1の場合、d
-
ret:=ret − x
-
-
((1ビット左シフトa [i])ビット単位AND b)がゼロ以外の場合、
-
b:=b XOR(1ビット左シフトa [i])
-
-
それ以外の場合
-
戻る
-
-
-
(retを1減らします)
-
-
関数go()
を呼び出します -
retを返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; int solve(int n) { vector<int> a; for (int x = n; x; x /= 10) a.push_back(x % 10); reverse(a.begin(), a.end()); int ret = n; for (int w = 1, d = 1; w < a.size(); ++w) { d *= min(9, 10 − w + 1); ret −= d; } auto go = [&]() { int b = (1 << 10) − 1; for (int i = 0; i < a.size(); ++i) { for (int d = (i < 1); d < a[i]; ++d) { int x = 0; if ((1 << d) & b) ++x; for (int j = i + 1; j < a.size(); ++j) x *= 10 − j; ret −= x; } if ((1 << a[i]) & b) b ^= (1 << a[i]); else return; } −−ret; }; go(); return ret; } int main(){ cout << solve(200) << endl; return 0; }
入力
200
出力
38
-
グラフ内のスーパー頂点を見つけるためのC++プログラム
n個の頂点を持つグラフが与えられたとします。頂点には1からnの番号が付けられ、配列edgesで指定されたエッジによって接続されます。各頂点には、配列valuesで指定された1からnまでの数値内のx値があります。ここで、グラフからスーパー頂点を見つける必要があります。頂点1からiへの最短経路にi番目の頂点と同じ「x」値を持つ頂点がない場合、頂点iは「スーパー頂点」と呼ばれます。この基準を満たすすべての頂点を印刷します。 したがって、入力がn =5のようである場合、値={1、2、2、1、3}、エッジ={{1、2}、{2、3}、{2、3}、{2、4 }、{4、5}}の場合、出力は1 345に
-
グリッド内の照らされたセルの数を見つけるためのC++プログラム
次元h*wのグリッドが与えられていると仮定します。グリッド内のセルには、球根または障害物のいずれかを含めることができます。電球のセルはそれ自体とその右、左、上、下のセルを照らし、障害物のセルが光を遮らない限り、光はセルを通して輝くことができます。障害物セルは照明できず、電球セルからの光が他のセルに到達するのを防ぎます。したがって、配列「bulb」内のグリッド内の電球セルの位置と配列「obstacles」内の障害物セルの位置を考えると、照らされているグリッド内のセルの総数を見つける必要があります。 したがって、入力がh =4、w =4、bulb ={{1、1}、{2、2}、{3、3}}、障害物