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

活動選択問題


開始時間と終了時間でn種類のアクティビティが提供されます。 1人で解決するアクティビティの最大数を選択します。貪欲なアプローチを使用して、残りのアクティビティの中で終了時間が最小で、開始時間が最後に選択したアクティビティの終了時間以上である次のアクティビティを見つけます。

  • この問題の複雑さは、リストがソートされていない場合のO(n log n)です。
  • ソートされたリストが提供される場合、複雑さはO(n)になります。

入力と出力

Input:
A list of different activities with starting and ending times.
{(5,9), (1,2), (3,4), (0,6), (5,7), (8,9)}
Output:
Selected Activities are:
Activity: 0 , Start: 1 End: 2
Activity: 1 , Start: 3 End: 4
Activity: 3 , Start: 5 End: 7
Activity: 5 , Start: 8 End: 9

アルゴリズム

maxActivity(act, size)

入力: アクティビティのリスト、およびリスト内の要素の数。

出力- アクティビティの順序はどのように選択されたか。

Begin
   initially sort the given activity List
   set i := 1
   display the ith activity //in this case it is the first activity

   for j := 1 to n-1 do
      if start time of act[j] >= end of act[i] then
         display the jth activity
         i := j
   done
End
を表示します。

#include<iostream>
#include<algorithm>
using namespace std;

struct Activitiy {
   int start, end;
};

bool comp(Activitiy act1, Activitiy act2) {
   return (act1.end < act2.end);
}

void maxActivity(Activitiy act[], int n) {
   sort(act, act+n, comp); //sort activities using compare function

   cout << "Selected Activities are: " << endl;
   int i = 0;// first activity as 0 is selected
   cout << "Activity: " << i << " , Start: " <<act[i].start << " End:
      " << act[i].end <<endl;

   for (int j = 1; j < n; j++) { //for all other activities
      if (act[j].start >= act[i].end) { //when start time is >= end
         time, print the activity
         cout << "Activity: " << j << " , Start: " <<act[j].start << " End: " << act[j].end <<endl;
         i = j;
      }
   }
}

int main() {
   Activitiy actArr[] = {{5,9},{1,2},{3,4},{0,6},{5,7},{8,9}};
   int n = 6;
   maxActivity(actArr,n);
   return 0;
}

出力

Selected Activities are:
Activity: 0 , Start: 1 End: 2
Activity: 1 , Start: 3 End: 4
Activity: 3 , Start: 5 End: 7
Activity: 5 , Start: 8 End: 9

  1. M-着色の問題

    この問題では、無向グラフが表示されます。 m色もご用意しております。問題は、グラフの2つの隣接する頂点が同じ色にならないように、m個の異なる色のノードを割り当てることができるかどうかを見つけることです。解決策が存在する場合は、どの頂点にどの色が割り当てられているかを表示します。 頂点0から始めて、色を1つずつ異なるノードに割り当てようとします。ただし、割り当てる前に、色が安全かどうかを確認する必要があります。隣接する頂点に同じ色が含まれているかどうかにかかわらず、色は安全ではありません。 入力と出力 Input: The adjacency matrix of a graph G(V, E)

  2. アクティビティ選択問題のためのPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −それぞれの開始時間と終了時間でn個のアクティビティが与えられます。一度に1つのアクティビティに取り組む場合、1人が実行できるアクティビティの最大数を選択する必要があります。 可変表記 N-アクティビティの総数 S-すべてのアクティビティの開始時刻を含む配列 F-すべてのアクティビティの終了時間を含む配列 次に、以下の実装のソリューションを見てみましょう- #欲張りアプローチ 例 # maximum number of activities that can be performed by a