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

C++ですべてのポイントを訪問する最小時間


配列として与えられたいくつかの点があると仮定します。すべてのポイントを訪問するための最小時間を秒単位で見つける必要があります。いくつかの条件があります。

  • 1秒で、垂直、水平、斜めに移動できます
  • 配列に表示されるのと同じ順序でポイントにアクセスする必要があります。

したがって、ポイントが[(1、1)、(3、4)、(-1、0)]の場合、出力は7になります。最短ルートのシーケンスをチェックすると、シーケンスは(1、1 )、(2、2)、(3、3)、(3、4)、(2、3)、(1、2)、(0、1)、(-1、0)

これを解決するために、2つの連続するポイントのx座標の差、および2つの連続するポイントのy座標の差の最大値を見つけます。最大値が合計されます。

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
      int minTimeToVisitAllPoints(vector<vector<int>>& p) {
         int ans = 0;
         int n = p.size();
         for(int i = 1; i < n; i++){
            ans += max(abs(p[i][0] - p[i-1][0]), abs(p[i][1] - p[i-1] [1]));
         }
         return ans;
      }
};
main(){
   Solution ob;
   vector<vector<int>> c = {{1,1},{3,4},{-1,0}};
   cout << ob.minTimeToVisitAllPoints(c);
}

入力

[[1,1],[3,4],[-1,0]]

出力

7

  1. C++での最小の騎士の動き

    座標が-無限大から+無限大までの無限のチェス盤があり、正方形[0、0]に騎士がいるとします。騎士は、以下に示すように、8つの可能な動きをすることができます。それぞれの動きは、基本方向に2マス、次に直交方向に1マスです。 騎士を正方形[x、y]に移動するために必要な最小ステップ数を見つける必要があります。答えが存在することが保証されています。 したがって、入力がx=5およびy=5の場合、出力は4になります。これは[0,0]→[2,1]→[4,2]→[3,4]→[のようになります。 5,5] これを解決するには、次の手順に従います- マップを定義するm Solve()とい

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

    会社に、従業員ごとに一意のIDを持つn人の従業員がいるとします。これらのIDの範囲は0からn-1です。会社の責任者はheadIDを持つものです。各従業員には、manager配列で指定された1人の直属の上司がいます。ここで、manager [i]はi番目の従業員の直属の上司であり、manager [headID]=-1です。また、従属関係がツリーのような構造になることが保証されています。ここで、会社の責任者は、会社のすべての従業員に緊急のニュースを通知したいと考えています。彼は直属の部下に通知することができ、すべての従業員が緊急のニュースを知るまで、部下などに通知します。 i番目の従業員は、すべ