會場安排問題(貪心策略)

會場安排問題

問題描述:假設要在足夠多的會場裏安排一批活動,活動的開始時間和結束時間已知,並希望使用儘可能少的會場。設計一個有效的算法進行安排。

分析:這個問題實際上是著名的圖着色問題。若將每一個活動作爲圖的一個頂點,不相容活動間用邊相連。使相鄰頂點着有不同顏色的最小着色數,就對應要找的最小會場數。 圖的最少着色問題,至今沒有有效的算法,但這個問題和圖的着色問題有不同,活動的時間區間之間的約束關係轉化得到的圖,屬於區間圖。我們可以用貪心策略來解決。

#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;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章