ホームページ  >  記事  >  バックエンド開発  >  C++ のクレーのアルゴリズム (線分の和集合長)

C++ のクレーのアルゴリズム (線分の和集合長)

WBOY
WBOY転載
2023-08-29 20:37:061220ブラウズ

C++ のクレーのアルゴリズム (線分の和集合長)

このチュートリアルでは、線分の結合の長さを求めるプログラムを作成します。

線分の始点と終点を指定したので、線分の結合の長さを見つける必要があります。

私たちが使用するアルゴリズムは、klee のアルゴリズムと呼ばれます。

この問題を解決する手順を見てみましょう。

  • すべての線分の座標を使用して配列を初期化します。
  • サイズが線分配列の 2 倍である、points という名前のベクトルを初期化します。
  • 線分配列をトラバースします。
    • 現在の線分の最初の点を埋め、点配列のインデックス i * 2 の位置を false に設定します。
    • 現在の線分の 2 番目の点を埋め、点配列のインデックス i * 2 1 の位置を false に設定します。
  • 点配列を並べ替えます。
  • カウンター変数を使用して、ポイント配列を走査します。
    • カウンタが 0 より大きい場合は、i の最初の点と i-1 を結果に加算します。
    • 2 番目のポイントがある場合は、カウンターを 1 減らし、そうでない場合はカウンターを増やします。
  • #結果を返します。

コードを見てみましょう。

デモ

#include<bits/stdc++.h>
using namespace std;
int segmentUnionLength(const vector<pair <int,int>> &segments) {
   int n = segments.size();
   vector<pair<int, bool>> points(n * 2);
   for (int i = 0; i < n; i++) {
      points[i*2] = make_pair(segments[i].first, false);
      points[i*2 + 1] = make_pair(segments[i].second, true);
   }
   sort(points.begin(), points.end());
   int result = 0, count = 0;
   for (int i = 0; i < n * 2; i++){
      if (count) {
         result += points[i].first - points[i-1].first;
      }
      points[i].second ? count-- : count++;
   }
   return result;
}
int main() {
   vector<pair<int,int>> segments;
   segments.push_back(make_pair(1, 3));
   segments.push_back(make_pair(2, 7));
   segments.push_back(make_pair(6, 12));
   segments.push_back(make_pair(13, 5));
   cout << segmentUnionLength(segments) << endl;
   return 0;
}

出力

上記のコードを実行すると、次の結果が得られます。

6

結論

チュートリアル中に質問がある場合は、コメント セクションで質問してください。

以上がC++ のクレーのアルゴリズム (線分の和集合長)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。