會場安排問題
問題描述:假設要在足夠多的會場裏安排一批活動,活動的開始時間和結束時間已知,並希望使用儘可能少的會場。設計一個有效的算法進行安排。
分析:這個問題實際上是著名的圖着色問題。若將每一個活動作爲圖的一個頂點,不相容活動間用邊相連。使相鄰頂點着有不同顏色的最小着色數,就對應要找的最小會場數。 圖的最少着色問題,至今沒有有效的算法,但這個問題和圖的着色問題有不同,活動的時間區間之間的約束關係轉化得到的圖,屬於區間圖。我們可以用貪心策略來解決。
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct activity
{
int start;
int finish;
}A;
bool cmp(A a1,A a2)
{
return a1.finish<a2.finish;
}
int main()
{
int n ;
cin>>n;
int s[100];//記錄每個會場的結束時間
A a[100];
for(int i = 0;i < n;i++)
{
cin>>a[i].start;
cin>>a[i].finish;
}
sort(a,a+n,cmp);
s[1] = a[0].finish;//第一個會場的結束時間就是最早結束的時間
int j = 1;
for(int i = 1;i < n;i++)
{
int flag = 0;//標記
for(int q = 1;q <= j;q++)//遍歷每個會場,看當前活動是否可以插入其中一個會場( 即當前活動的開始時間大於等於其中一個會場的結束時間
if(a[i].start >= s[q])
{
flag = 1;
s[q] = a[i].finish;//找到了就將這個會場的結束時間換成當前活動的結束時間(表示可以插入)
break;
}
if(!flag)//找不到就在s中開闢一個會場
{
j++;
s[j] = a[i].finish;
}
}
cout<<j;
}