C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

競技プログラミングのためのC++のトリック(C ++ 11の場合)?


ここでは、さまざまな分野で役立つC++プログラミング言語の優れたトリックをいくつか紹介します。競技プログラミングイベントに参加したい場合のように、これらのトリックはコードを書く時間を短縮するのに役立ちます。これらの例を1つずつ見ていきましょう。

  • %演算子を使用せずに、数値が奇数か偶数かを確認します。このトリックは簡単です。数値と1を使用してビット単位のAND演算を実行できます。結果がゼロ以外の場合、これは奇数です。それ以外の場合、これは偶数です。ロジックが単純すぎます。すべての奇数はLSbで1になります。したがって、ANDを1で実行すると、LSbを除くすべての文字がマスクされるため、目的の結果を簡単に得ることができます。

if ((n & 1) != 0) {
   //this is odd
} else {
   //This is even
}
  • シフト演算子を使用して高速の乗算と除算。数値に2nのような数値を掛けたい場合は、数値を左にn回シフトするだけです。同様に、数値を2nで除算する場合は、数値を右にn回シフトします。

x = 40;
y = x << 2; //x will be multiplied with 4, so y = 160
cout << x;
x = 40;
y = x >> 2; //x will be divided by 4, so y = 10
cout << x;
  • 3番目の変数を使用せずに2つの数値を交換できます。これは、+および–演算子を使用して実行できます。ただし、ビット単位のXOR演算子を使用してそれを行うこともできます。番号を手動で確認して確認できます。

//swap x and y
x ^= y;
y ^= x;
x ^= y;
  • コードでstrlen()関数を使用できないという制約がある場合があります。その場合、独自のstrlen()関数を作成します。ケースが文字にアクセスするだけの場合は、実際にこれを行う必要はありません。位置iの文字が有効(ゼロ以外)かどうかを確認できます。これがゼロ以外の場合はトラバースできますが、そうでない場合は停止します。

for(int i = 0; s[i]; i++){
   cout << s[i];
}
  • ほとんどの場合、STLでpush_back()関数を使用して、ベクトルなどの一部のコンテナーに新しい要素を追加します。これを使用せずに、emplace_back()を使用することもできます。この関数ははるかに高速です。これはメモリを別の場所に割り当てず、割り当てられたメモリをコンテナに追加します。

  • C++は組み込みのGCD機能を提供します。さまざまなケースで使用できます。構文は次のようになります。

__gcd(x, y) //find GCD of x and y
  • main関数の配列の最大サイズは10^6のオーダーです。ただし、配列がグローバルに宣言されている場合は、最大10^7のサイズを宣言できます。

  • 対数演算を使用して、任意の数値の最上位桁を計算できます。アイデアを得るには、次のロジックを参照してください

n = 4578;
double k = log10(n);
k = k – floor(k);
int x = pow(10, k); //x is the most significant digit
  • ログ演算を使用して桁数を直接計算します。このためにループは使用しません。

n = 4578;
int digit_count = floot(log10(n)) + 1
  • このロジックを使用して、数値が2の累乗であるかどうかを直接確認できます。

x = 1024;
bool check = x && (!(x & (x-1))); //if this is true, then power of two.
  • いくつかの組み込みアルゴリズムがC++にあり、次の条件をチェックできます。

all_of(left, left + n, isPositive()); //check all are positive or not
any_of(left, left + n, isPositive()); //check at least one positive or not.
none_of(left, left + n, isPositive()); //check no elements are positive
  • あるコンテナから別のコンテナに要素をコピーするコピー機能。

int src[5] = {10, 20, 30, 40, 50};
int des[5];
copy_n(src, 5, dest);
  • itoa()と呼ばれるアルゴリズムがあります。このアルゴリズムを使用すると、* firstに初期値を割り当て、次にポストインクリメント演算子を使用して値を使用するかのように、順次増加する値の範囲を作成できます。

int arr[5] = {0};
char str[5] = {0};
itoa(arr, arr+5, 15); //it will generate {15, 16, 17, 18, 19}
itoa(str, str+5, ‘A’); //it will generate {‘A’, ‘B’, ‘C’, ‘D’, ‘E’}
  • バイナリ形式で値を割り当てます。 0bプレフィックスと2進数を使用して、その番号が2進数で提供されていることを示すことができます。

int x = 0b1101; //then x will hold 13
  • C ++では、条件演算子を使用せずにキーワードを使用できます。同様に、キーワード「and」は「&」の代わりに使用できます。

x = 10;
if(x < 10 and x > 5)
   cout << “True” << endl;
else
   cout << “False” << endl;
//This will return True

  1. C ++での競技コーディングにSTLを使用するBFS?

    幅優先探索(BFS)トラバーサルはアルゴリズムであり、特定のグラフのすべてのノードにアクセスするために使用されます。このトラバーサルアルゴリズムでは、1つのノードが選択され、隣接するすべてのノードが1つずつ訪問されます。隣接するすべての頂点を完了すると、さらに移動して別の頂点をチェックし、隣接する頂点を再度チェックします。 競技コーディングでは、問題を非常に迅速に解決する必要があります。このアルゴリズムを実装するには、STL(C ++の標準ライブラリ)を使用します。キューデータ構造を使用する必要があります。隣接するすべての頂点がキューに追加されます。隣接するすべての頂点が完了すると、1

  2. 競技コーディングのためのPythonの秘訣

    Pythonは、ほとんどの競技プログラミングの課題でコーダーの間で好まれる言語の1つです。ほとんどの問題は、Pythonを使用して妥当な時間枠で簡単に計算できます。 複雑な問題のいくつかについては、十分に高速なPythonコードを書くことがしばしば課題になります。以下は、競技コーディングでコードのパフォーマンスを向上させるのに役立つpythonicコード構造の一部です- 1。文字列の連結 :以下の構成は使用しないでください。 str1 = "" some_list = ["Welcome ", "To ", "Tutor