会場配置問題(貪欲なアルゴリズム)
1.タイトルの説明
イベントのグループを十分な数の会場に配置し、できるだけ少ない会場を使用したいとします。配置する効果的な貪欲なアルゴリズムを設計します。スケジュールされる特定のk個のイベントについて、開催地が最も少ないタイムテーブルを計算します。
入力
最初の行に正の整数kがあります。これは、配置するアクティビティがk個あることを意味します。次のk行では、各行に2つの正の整数があり、スケジュールされるk個のアクティビティの開始時刻と終了時刻を表します。時間は0:00から分単位です。
出力
計算された会議サイトの最小数をに出力します。
サンプル入力コピー
5
1 23
12 28
25 35
27 80
36 50
サンプル出力コピー
3
2.ケース分析
この場合、構造を使用してイベントを定義します。countはイベントの数を表し、room_availは空き時間を調整でき、room_numはスケジュールされた会場の数を表し、flagはイベントタグとして使用され、スケジュールされたイベントフラグは1に設定されます。 。貪欲なアルゴリズムにより、ローカル最適ソリューションが選択されます。つまり、十分なアクティビティが最小の会場に配置され、他のアクティビティが1つの会場に配置できない場合は、すべてのアクティビティが配置されるまで次の会場に配置されます。最終に戻るすべてのイベントが予定されている会場の数。
3、ケースコード
#include<iostream>
#include<cstdio>
using namespace std;
struct ans{ //定义结构体表示活动
int begin,end;
bool flag; //设置标志
};
int arrange(int k,ans *a)
{
int count=k,room_avail=0,room_num=0;
while(count>0)
{
for(int i=1;i<=k;i++)
{
if((a[i].begin>room_avail)&&(a[i].flag==0)) //如果当前活动未安排并且和会场已有活动不冲突
{
room_avail=a[i].end; //将当前活动加入该会场并更新会场的空闲时间
a[i].flag=1;
count--;
}
}
room_avail=0; //将room_avail初始化
room_num++; //遍历一次,使用的会场数加一
}
return room_num; //返回安排的会场数
}
int main()
{
int k,room_num;
cin>>k;
ans a[k+1];
for(int i=1;i<=k;i++)
{
cin>>a[i].begin>>a[i].end;
a[i].flag=0;
}
room_num=arrange(k,a) ;
cout<<room_num<<endl;
return 0;
}
4、実行中の結果
5
1 23
12 28
25 35
27 80
36 50
3
--------------------------------
Process exited after 1.365 seconds with return value 0
请按任意键继续. . .