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