2. 最多有幾台機器一起運作 Solution


貪婪準則是先將n個工作以開始時間最早的工作排在前面,若開始時間相同就以最早結束的工作排在前面進行排序,將排序好的工作,由最前面依序取出每個工作,優先分配到目前已經執行完畢或沒有工作可以執行的機器,若全部機器都有工作正在執行就需要啟用新的機器。需使用陣列m,紀錄每個機器執行目前工作完成後的時間,才能判斷機器是否有空可以執行下一個工作,還是要啟動新的機器。

#include <bits/stdc++.h>
using namespace std;

struct Job{
    int startTime, endTime;
}jobs[105];

int N, taskEndTime[105];

bool cmp( Job A, Job B ){
    if ( A.startTime != B.startTime ) //兩個任務開始時間不同的話
    {
        return A.startTime < B.startTime; //把開始時間早的任務放在前面
    }
    return A.endTime < B.endTime;     //如果開始時間一樣,則把結束時間早的放前面
}

int main(){

    while ( cin >> N ){
        // 輸入完任務資訊,並且排序,做好初始化
        for ( int i = 0 ; i < N ; i++ )
            cin >> jobs[i].startTime >> jobs[i].endTime;
        sort( jobs, jobs+N, cmp );

        int machineCount = 1; //machineCount代表需要幾台機器

        //第一台機器接第一個任務,所以只能處理 jobs[0].e 後的工作
        taskEndTime[ 1 ] = jobs[0].endTime;

        //因為第 1 個任務已經決定了,所以i就從0開始
        //也就是從第 2 個任務開始
        for ( int i = 1 ; i < N ; i++ ){

            bool found = false; //預設找不到能接著做的工作

            //檢查每一台機器能不能指派工作
            for ( int j = 1 ; j <= machineCount ; j++ ){
                //目前要分配的工作如果比機器的工作結束時間還晚,代表可以做
                if ( jobs[i].startTime >= taskEndTime[j] ){
                    taskEndTime[j] = jobs[i].endTime; //把工作指派給這機器
                    found = true;
                    break;
                }
            }

            //沒找到能做的工作,所以要再啟動一台機器
            if ( !found ){
                machineCount++;
                taskEndTime[ machineCount ] = jobs[i].endTime;
            }

        }
        cout << machineCount << endl;

    }
    return 0;
}

results matching ""

    No results matching ""