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

C++のすべてのガソリンポンプを訪問する最初の循環ツアーを見つけます


円があり、円上にn個のガソリンポンプがあるとします。 -

のような2つのデータセットがあります
  • すべてのガソリンポンプが持つガソリンの量
  • あるガソリンポンプから別のガソリンポンプまでの距離

トラックが円を完成できる最初のポイントを計算します。 1リットルのガソリンの場合、トラックは1単位の距離を移動できます。ガソリンポンプが4つあり、ガソリンの量があり、次のガソリンポンプからの距離が[(4、6)、(6、5)、(7、3)、(4、5)]のようになっているとします。トラックが循環ツアーを行うことができる最初のポイントは、2番目のガソリンポンプです。出力はstart=1(2番目のパトロールポンプのインデックス)である必要があります

この問題は、キューを使用して効率的に解決できます。キューは、現在のツアーを保存するために使用されます。最初のガソリンポンプをキューに挿入し、ツアーを完了するか、現在のガソリン量がマイナスになるまでガソリンポンプを挿入します。量がマイナスになった場合は、空になるまでガソリンポンプを削除し続けます。

#include <iostream>
using namespace std;
class pump {
   public:
      int petrol;
      int distance;
};
int findStartIndex(pump pumpQueue[], int n) {
   int start_point = 0;
   int end_point = 1;
   int curr_petrol = pumpQueue[start_point].petrol - pumpQueue[start_point].distance;
   while (end_point != start_point || curr_petrol < 0) {
      while (curr_petrol < 0 && start_point != end_point) {
         curr_petrol -= pumpQueue[start_point].petrol - pumpQueue[start_point].distance;
         start_point = (start_point + 1) % n;
         if (start_point == 0)
            return -1;
      }
      curr_petrol += pumpQueue[end_point].petrol - pumpQueue[end_point].distance;
      end_point = (end_point + 1) % n;
   }
   return start_point;
}
int main() {
   pump PumpArray[] = {{4, 6}, {6, 5}, {7, 3}, {4, 5}};
   int n = sizeof(PumpArray)/sizeof(PumpArray[0]);
   int start = findStartIndex(PumpArray, n);
   if(start == -1)
      cout<<"No solution";
   else
      cout<<"Index of first petrol pump : "<<start;
}

出力

Index of first petrol pump : 1

  1. C ++で指定された文字列内の「1(0+)1」のすべてのパターンを検索します

    文字列に1(0+)1のようなパターンがあるとします。ここで、(0+)は、空でない連続した1の出現を示します。すべてのパターンを見つける必要があります。パターンは重複する可能性があります。文字列は必ずしもバイナリ文字列である必要はありません。数字と小文字のみを保持できます。文字列が1101001のようなものであるとすると、そのようなパターンが2つあります。 101と1001。 この問題を解決するために、次の手順に従います- 文字列内のすべての文字cを繰り返し処理します cが1の場合、要素が0になるまで繰り返します 0のストリームが終了すると、次の文字が1かどうかを確認します

  2. C ++でa%b =kとなるような配列内のすべてのペア(a、b)を検索します

    配列Aがあるとすると、その配列から、a%b =kとなるようにすべてのペア(a、b)を取得する必要があります。配列がA=[2、3、4、5、7]、k =3であるとすると、ペアは(7、4)、(3、4)、(3、5)、(3、7)になります。 これを解決するために、リストをトラバースして、指定された条件が満たされているかどうかを確認します。 例 #include <iostream> using namespace std; bool displayPairs(int arr[], int n, int k) {    bool pairAvilable = true;