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

C++ですべての従業員に通知するために必要な時間


会社に、従業員ごとに一意のIDを持つn人の従業員がいるとします。これらのIDの範囲は0からn-1です。会社の責任者はheadIDを持つものです。各従業員には、manager配列で指定された1人の直属の上司がいます。ここで、manager [i]はi番目の従業員の直属の上司であり、manager [headID]=-1です。また、従属関係がツリーのような構造になることが保証されています。ここで、会社の責任者は、会社のすべての従業員に緊急のニュースを通知したいと考えています。彼は直属の部下に通知することができ、すべての従業員が緊急のニュースを知るまで、部下などに通知します。 i番目の従業員は、すべての直属の部下に通知するためにinformTime [i]分が必要です(したがって、informTime [i]分後、すべての直属の部下がニュースを広め始めることができます)。緊急のニュースを全従業員に知らせるのに必要な分数を見つける必要があります。したがって、入力がn =6、headID =2、manager =[2,2、-1,2,2,2]、infromTime =[0,0,1,0,0,0]の場合、出力は1になります。

C++ですべての従業員に通知するために必要な時間

これを解決するには、次の手順に従います-

  • ret:=0

  • サイズnのグラフと呼ばれる配列を定義し、ルートを設定します:=-1

  • 0からマネージャー配列のサイズまでの範囲のiの場合

    • u:=managet [i]およびv:=i

    • uが-1の場合、root:=vを設定し、次の反復に進みます

    • vをグラフに挿入[u]

  • キューqを定義し、ルートをqに挿入し、サイズnのtimeという配列を定義します

  • qが空になるまで

    • curr:=qのフロント要素、およびqからフロント要素を削除

    • グラフ[curr]のリストのサイズが0の場合、次の反復にスキップします

    • 0からグラフのリストのサイズまでの範囲のiの場合[curr]

      • グラフ[curr、i]をq

        に挿入します
      • time [graph [curr、i]]:=time [curr] + informTime [curr]

  • 0からn– 1の範囲のiの場合:ret:=retと時間の最大値[i]

  • retを返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
      int ret = 0;
      vector <int> graph[n];
      int root = -1;
      for(int i = 0; i < manager.size(); i++){
         int u = manager[i];
         int v = i;
         if(u == -1) {
            root = v;
            continue;
         }
         graph[u].push_back(v);
      }
      queue <int> q;
      q.push(root);
      vector <int> time(n);
      while(!q.empty()){
         int curr = q.front();
         q.pop();
         if(!graph[curr].size()) continue;
         for(int i = 0; i < graph[curr].size(); i++){
            q.push(graph[curr][i]);
            time[graph[curr][i]] = time[curr] + informTime[curr];
         }
      }
      for(int i = 0; i <n; i++)ret = max(ret, time[i]);
      return ret;
   }
};
main(){
   vector<int> v = {2,2,-1,2,2,2}, v1 = {0,0,1,0,0,0};
   Solution ob;
   cout << (ob.numOfMinutes(6, 2, v, v1));
}

入力

6
2
[2,2,-1,2,2,2]
[0,0,1,0,0,0]

出力

1

  1. C++でツリー内のすべてのリンゴを収集するための最小時間

    n個の頂点で構成される無向ツリーがあり、これらの番号が0からn-1で、頂点にいくつかのリンゴがあるとします。木の片方の端を歩くのに1秒かかります。頂点0から始まり、この頂点に戻るツリー内のすべてのリンゴを収集するために費やす必要のある最小時間を秒単位で見つける必要があります。 ここで、無向ツリーのエッジは配列のエッジで指定されます。ここで、edges [i] =[from_i、to_i]は、頂点from_iとto_iを接続するエッジが存在することを意味します。さらに、別の配列にリンゴがあります。hasApple[i] =trueは、頂点iにリンゴがあることを意味します。それ以外の場合は、リン

  2. C++の配列内のすべての素数の積

    いくつかの要素を持つ整数配列arr[]が与えられた場合、タスクはその数のすべての素数の積を見つけることです。 素数は、1で割った数、またはその数自体です。または、素数は、1とその数自体を除いて他の数で割り切れない数です。 1、2、3、5、7、11など 与えられた配列の解を見つける必要があります- 入力 −arr [] ={11、20、31、4、5、6、70} 出力 − 1705 説明 −配列の素数は− 11、31、5であり、それらの積は1705 入力 − arr [] ={1、2、3、4、5、6、7} 出力 − 210 説明 −配列の素数は− 1、2、3、5、7