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

C++でプロセスを強制終了します


n個のプロセスがあるとします。ここでは、各プロセスにPIDまたはプロセスIDと呼ばれる一意のIDがあり、そのPPID(親プロセスID)もそこにあります。

各プロセスには1つの親プロセスしかありませんが、1つ以上の子プロセスがある場合があります。

これは木の構造のようなものです。 PPID =0のプロセスは1つだけです。これは、このプロセスに親プロセスがないことを意味します。すべてのPIDは一意の正の整数になります。

プロセスのリストを表すために2つの整数のリストを使用します。最初のリストには、各プロセスのPIDが含まれ、2番目のリストには対応するPPIDが含まれます。したがって、2つのリストがあり、強制終了するプロセスを表すPIDがある場合、最終的に強制終了されるプロセスのPIDのリストを見つける必要があります。また、プロセスが強制終了されると、そのすべての子プロセスが強制終了されると想定する必要があります。

したがって、入力がpid =[1、3、10、5] ppid =[3、0、5、3] kill =5の場合、出力は[5,10]、

になります。

C++でプロセスを強制終了します

5を倒すと10も倒されます。

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

  • マップの子を1つ定義する

  • n:=pidのサイズ

  • 配列retを定義する

  • 初期化i:=0の場合、i

    • u:=ppid [i]

    • v:=pid [i]

    • 子の末尾にvを挿入します[u]

  • 1つのキューを定義するq

  • qにkillを挿入

  • (qが空ではない)間、-

    • curr:=qの最初の要素

    • qから要素を削除

    • retの最後にcurrを挿入します

    • 初期化i:=0の場合、i <子のサイズ[curr]の場合、更新(iを1増やします)、実行-

      • child [curr、i]をq

        に挿入します
  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<int> killProcess(vector<int>& pid, vector<int>& ppid, int kill) {
      map<int, vector<int> > child;
      int n = pid.size();
      vector<int> ret;
      for (int i = 0; i < n; i++) {
         int u = ppid[i];
         int v = pid[i];
         child[u].push_back(v);
      }
      queue<int> q;
      q.push(kill);
      while (!q.empty()) {
         int curr = q.front();
         q.pop();
         ret.push_back(curr);
         for (int i = 0; i < child[curr].size(); i++) {
            q.push(child[curr][i]);
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,3,10,5}, v1 = {3,0,5,3};
   print_vector(ob.killProcess(v, v1, 5));
}

入力

{1,3,10,5},{3,0,5,3},5

出力

[5, 10, ]

  1. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

  2. C++の長方形エリアII

    (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r