C++で指定されたオブジェクトの配列から最大の高さのピラミッドを見つけます
n個のオブジェクトの配列があるとします。各オブジェクトの幅はW[i]です。 -
のようにピラミッド状に配置する必要があります-
i番目の全幅が(i + 1)番目未満
-
i番目のオブジェクトの総数が(i + 1)番目未満です
たとえば、重みが[40、100、20、30]の場合、出力は2になります。したがって、最上位レベルは30、次に下位レベル20、40、100
これを解決するために、欲張りアプローチを使用します。アイデアは、幅の狭いオブジェクトを上部に配置し、次のオブジェクトを真下のレベルに配置するというように使用することです。レベルの最大数を取得するには、指定された配列を並べ替えて、上から下にピラミッドを形成してみてください。
次に、並べ替え後の配列の最初の要素のような配列の最小要素を見つけて、それを一番上に配置します。次に、オブジェクトの数と幅を増やして、その下にレベルを作成してみてください。
例
#include <iostream> #include <algorithm> using namespace std; int maxLevelPyramid(int objects[], int n) { sort(objects, objects + n); int ans = 1; int prev_w = objects[0]; int count_p = 1; int count_c = 0; int curr_w = 0; for (int i=1; i<n; i++){ curr_w += objects[i]; count_c++; if (curr_w > prev_w && count_c > count_p){ prev_w = curr_w; count_p = count_c; count_c = curr_w = 0; ans++; } } return ans; } int main() { int boxes[] = {40, 100, 20, 30}; int n = sizeof(boxes)/sizeof(boxes[0]); cout << "Max level of pyramid: " << maxLevelPyramid(boxes, n); }
出力
Max level of pyramid: 2
-
C++で指定された遷移を介して最後に到達することが可能かどうかを確認します
x軸上にn個のポイントがあり、ポイント間の許可された平行移動のリストがあるとします。これらのトランザクションのみを介して、開始点から終了に到達できるかどうかを確認します。したがって、点x1とx2の間に平行移動がある場合は、点xからx1とx2の間の任意の中間点に移動するか、直接x2に移動できます。したがって、n =5の場合、トランザクションは0から2、2から4、および3から5になります。その場合、出力はYESになります。 0→2→3→5からのパスがあります。 ペアの最初の要素に従ってリストを並べ替える必要があります。次に、リストの2番目のペアから開始し、ペアの最初の要素が前のペアの2番目の要素
-
C++で指定された依存関係からタスクの順序を見つけます
n個の異なるタスクがあるとします。これらのタスクには、0からn-1までのラベルが付けられています。一部のタスクには前提条件のタスクがある場合があるため、例として、タスク2を選択する場合は、最初にタスク1を終了する必要があります。これはペアとして表されます-[2、1]タスクの総数とリストがある場合前提条件のペアのうち、すべてのタスクを完了するには、タスクの順序を見つける必要があります。正しい注文が複数ある場合は、そのうちの1つを返品できます。また、指定されたすべてのタスクを完了することが不可能な場合は、空の配列を返します。 したがって、入力がn =4で、A =[[1、0]、[2、0]、[3、2