區間排程問題

2021-06-18 20:51:30 字數 1021 閱讀 5894

有n項工作,每項工作分別在start[i]時間開始,在end(i)時間結束。對於每項工作,你都可以選擇參與與否,如果選擇參與,那麼自始至終必須全程參與。此外參與時間段不能重疊(即使是開始的瞬間與結束的瞬間重疊也是不允許的),那麼最多能參與多少項工作?

//演算法思想:在可選的工作中,每次都選取結束時間最早的工作

#include #include #include using namespace std;

//設定全域性變數

const int max = 10000;

int n = 5;//工作的個數

int start[max] = ;//儲存開始時間的陣列

int end[max] = ;//儲存結束時間的陣列

pairspace[max];

//選取最多工作的個數

void solve()

//對結束時間按字典排序

sort(space, space + 5);

for(int j = 0; j < n; ++j)

}cout << count;

}int main()

在可選的工作中,我們可以選擇

(1)開始時間最早的,存在反例

(2)結束時間最早的

(3)用時最短的,反例

(4)與最少可選工作有重疊的,反例

直觀解釋,結束時間越早,後面可選的工作也越多.

證明方法(1)與其他方案相比,該演算法選擇了相同數量的更早開始的工作,其最終結束時間不會比其它方案的更晚。

(2)所以不存在選取更多工作的選擇方案

區間排程問題

有n項工作,每項工作分別在start i 時間開始,在end i 時間結束。對於每項工作,你都可以選擇參與與否,如果選擇參與,那麼自始至終必須全程參與。此外參與時間段不能重疊 即使是開始的瞬間與結束的瞬間重疊也是不允許的 那麼最多能參與多少項工作?演算法思想 在可選的工作中,每次都選取結束時間最早的...

區間排程問題

我們要選擇結束時間最早的,這樣才能保證選的區間比較多,因此這個裡面會有對區間的排序,結束時間最早排在前面,運用了pair,pair中有兩個屬性就是first,second,把s存在了second中,把t存在了first中,這樣就可以把結束時間最早放在前面。include include includ...

區間排程問題

區間排程問題 有n項工作,每項工作分別在si時間開始,在ti時間結束。對於每項工作,你都可以選擇參與與否。如果選擇了參與,那麼自始至終都必須全程參與。此外,參與工作的時間段不能重疊 即使是開始的瞬間和結束的瞬間的重疊也是不允許的 你的目標是參與盡可能多的工作,那麼最多能參與多少項工作呢?輸入格式 n...