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

C++でのロシアの人形の封筒


いくつかのエンベロープがあると仮定します。これらのエンベロープには、高さと幅の値がペアで含まれています。 2番目のエンベロープの高さと幅の両方が最初のエンベロープの高さと幅よりも小さい場合は、1つのエンベロープを別のエンベロープに入れることができます。それで、私たちが他の中に入れることができるエンベロープの最大数は何でしょう。したがって、入力が[[5,5]、[6,4]、[6,8]、[2,3]]の場合、最小のエンベロープは[2,3]であるため、出力は3になります。次に[5,5]、次に[6,8]。

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

  • 高さに基づいて配列vを並べ替えます。高さが同じ場合は、幅と比較します
  • vのサイズが0と同じ場合、-
    • 0を返す
  • 配列retを定義する
  • iを初期化する場合:=0、i
  • 配列の定義temp=v [i]
  • x:=temp [1]
  • 低:=0、高:=retのサイズ、curr:=0
  • 低い<=高い間、-
      を実行します
    • 中:=低+(高-低)/ 2
    • ret [mid]
    • curr:=mid + 1
    • 低:=中+1
  • それ以外の場合
    • 高:=中-1
  • curr <0の場合、-
    • 次の部分を無視し、次の反復にスキップします
  • curr> =retのサイズの場合、-
    • retの最後にtemp[1]を挿入
  • それ以外の場合
    • ret [curr]:=temp [1]
  • retの戻りサイズ
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       static bool cmp(vector <int> a, vector <int> b){
          if(a[0] == b[0])return a[1] > b[1];
          return a[0] < b[0];
       }
       int maxEnvelopes(vector<vector<int>>& v) {
          sort(v.begin(), v.end(), cmp);
          if(v.size() == 0)return 0;
          vector <int> ret;
          for(int i = 0; i < v.size(); i++){
             vector <int> temp = v[i];
             int x = temp[1];
             int low = 0;
             int high = ret.size() -1;
             int curr = 0;
             while(low <= high){
                int mid = low + (high - low) / 2;
                if(ret[mid]<temp[1]){
                   curr = mid + 1;
                   low = mid + 1;
                }else{
                   high = mid - 1;
                }
             }
             if(curr < 0) continue;
             if(curr >= (int)ret.size()){
                ret.push_back(temp[1]);;
             }else{
                ret[curr] = temp[1];
             }
          }
          return ret.size();
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{5,5}, {6,4}, {6,8}, {2,3}};
       cout << (ob.maxEnvelopes(v));
    }

    入力

    {{5,5}, {6,4}, {6,8}, {2,3}}

    出力

    3

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

      n個のプロセスがあるとします。ここでは、各プロセスにPIDまたはプロセスIDと呼ばれる一意のIDがあり、そのPPID(親プロセスID)もそこにあります。 各プロセスには1つの親プロセスしかありませんが、1つ以上の子プロセスがある場合があります。 これは木の構造のようなものです。 PPID =0のプロセスは1つだけです。これは、このプロセスに親プロセスがないことを意味します。すべてのPIDは一意の正の整数になります。 プロセスのリストを表すために2つの整数のリストを使用します。最初のリストには、各プロセスのPIDが含まれ、2番目のリストには対応するPPIDが含まれます。したがって、2つのリ

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

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