區間排程問題 多執行緒

2021-08-22 19:15:14 字數 940 閱讀 9054

區間排程問題_單執行緒是乙個人,這裡是k個人。

題目:

有n項工作,k個人,每項工作分別在si開始,ti結束。對每項工作,人都可以選擇參加或不參加,但選擇了參加某項工作就必須至始至終參加全程參與,注意(x1,y1) (x2,y2) y1==x2 不算重疊。求最多參加幾項工作。

樣例輸入

5 2

1 45 9

2 73 8

6 10

樣例輸出

3
思路:

貪心+模擬

首先按照結束時間從小到大排序,如果結束時間相同,那麼按照開始時間從小到大排序。

用multiset容器進行模擬(開始和結束時間能重疊時用multiset,不能重疊時用set),規定multiset容器中存的是當前選澤的活動的結束時間,然後開始遍歷其他的活動,如果當前所遍歷的活動的開始時間大於所選擇的活動的結束時間(只大於其中乙個就可以,假設大於編號為i的活動的結束時間),我們就把當前所遍歷的活動的結束時間放到muliset中去,覆蓋掉i活動的結束時間。否則,就不往muliset中加入(即不選擇這個活動)。

注意:初始的時候我們往muliset中放入k個0。

#include#define maxn 100005

using namespace std;

struct node

a[maxn];

int n,k;

multiset < int >q;

multiset < int >::iterator it;

bool cmp(node a,node b)//定義比較器

cout<}

區間排程問題

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

區間排程問題

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

區間排程問題

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