0129今天講了貪心 教室問題 2 我沒怎麼聽懂

2021-08-15 04:14:07 字數 2399 閱讀 7254

今天學習了貪心。

//上午做的感覺太差了。。。

需要整理一下

下午貪心也沒聽聽懂。

貪心之二:教室活動安排問題

有若干個活動,第i個開始時間和結束時間是[si,fi),活動之間不能交疊,要把活動都安排完,至少需要幾個教室?

輸入第一行乙個正整數n (n <= 10000)代表活動的個數。

第二行到第(n + 1)行包含n個開始時間和結束時間。

開始時間嚴格小於結束時間,並且時間都是非負整數,小於1000000000

輸出一行包含乙個整數表示最少教室的個數。

輸入示例

31 2

3 42 9

輸出示例

2參考**

這是要解決什麼問題呢?

我一定要除錯才明白麼。。。。

算了,剛開始,多理解一些,否則畫的時間太久了。

#include#include#include#includeusing namespace std;

setsta, ed;

int l[10005], r[10005], a[20010];

// 先開陣列

int main()

// 輸入兩個資料,分別是開始時間和結束時間

//【insert是啥】

// 【已 輸入完成,輸入完成,輸入完成】

int len=0;

for(int i=0; i

包含max(),sort() 

2、貪心需要用到  優先佇列,和sort()預設 是公升序,由小到大

3、ans = max(ans, k);所曾經達到的最多的。這個用法不錯,記一下。

【借鑑】

4、輸入1 5 2 8 3 9 的次序,記錄並儲存的話可以;

先有兩個陣列存一下,然後

int len = 0;

for (int i = 0; iy.start) return true;

return false;

}

優先的是  y結束的早(end值大)

或者,他們都一樣時間結束,但是x開始的晚(時間更少)

**貼上

#include#include#include#includeusing namespace std;

struct node

a[11111];

bool cmp(node x, node y)

int main()

// 然後第二個a[i], 判斷a[i].start >= end

// 就是 第二小的有沒有在他結束的時候ojbk

//如果有當然很好,如果沒有也沒關係

//每次push進去乙個,ans用來記錄。

} cout << ans << endl;

return 0;

}

(4) 看似最不對的策略——結束時間越早的活動優先。這個策略是有效的,我們可以證明。假設最優解opt中安排了m個活動,我們把這些活動也按照結束時間由小到大排序,顯然是不衝突的。假設排好順序後,這些活動是a(1) , a(2), a(3)….am

假設按照我們的貪心策略,選出的活動自然是按照結束時間排好順序的,並且也都是不衝突的,這些活動是b(1), b(2) …b(n)

【選出的】

問題關鍵是,假設a(1) = b(1), a(2) = b(2)…. a(k) = b(k),但是a(k+1) != b(k+1),回答幾個問題:

【在k以及k之後,他們不同了】

【f(b(k+1)) <= f(a(k+1))】

【b是最優  a是排好序的】

(1)b(k+1)會在a(k+2), a(k+3), …. a(m)中出現麼?

不會。因為b(k+1)的結束時間是最早的,即f(b(k+1)) <= f(a(k+1)),而a(k+2), a(k+3), …. a(m)的開始時間和結束時間都在f(a(k+1))之後,所以b(k+1)不在其中。

(2)b(k+1)和a(1), a(2), …. a(k) 衝突麼?

不衝突,因為a(1), a(2), …. a(k)就是b(1), b(2), …. b(k)

(3)b(k+1)和a(k+2), a(k+3), …. a(m)衝突麼?

不衝突,因為f(b(k+1)) <= f(a(k+1)),而a(k+2), a(k+3), …. a(m)的開始時間都在f(a(k+1))之後,更在f(b(k+1))之後。

因此我們可以把a(k+1) 換成b(k+1), 從而最優解和我們貪心得到的解多了乙個相同的,經過乙個乙個替換,我們可以把最優解完全替換成我們貪心策略得到的解。 從而證明了這個貪心策略的最優性。

最後,我們來提供輸入輸出資料,由你來寫一段程式,實現這個演算法,只有寫出了正確的程式,才能繼續後面的課程。

貪心 活動安排問題2

題目大意 有若干個活動,第i個開始時間和結束時間是 si,fi 同乙個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室?解題關鍵 策略 按照開始時間排序優先安排活動,如果衝突,則加乙個教室。1 利用優先佇列 1 include2 define inf 0x3f3f3f3f 3using...

SDUT 活動選擇問題2 貪心

time limit 1000 ms memory limit 65536 kib submit statistic problem description sdut 大學生藝術中心每天都有n個活動申請舉辦,但是為了舉辦更多的活動,必須要放棄一些活動,求出每天最多能舉辦多少活動。input 輸入包括...

貪心(教室安排問題 區間不相交可以用乙個)

有若干個活動,第i個開始時間和結束時間是 si,fi 同乙個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室?input 第一行乙個正整數n n 10000 代表活動的個數。第二行到第 n 1 行包含n個開始時間和結束時間。開始時間嚴格小於結束時間,並且時間都是非負整數,小於10000...