Cleaning Shifts(區間覆蓋)

2022-03-12 03:17:30 字數 971 閱讀 2288

/*

題目:

給定乙個時間t和n個時間區間,求最少需要多少個區間覆蓋總區間[1,t],無法覆蓋區域[1,t]時輸出-1。

例如t=10,有3個區間[1,7],[3,6],[8,10],則最少需要兩個區間來覆蓋,選擇區間1和區間3。

解題思路:

使用貪心法。首先將區間按開始時間從小到大排序,開始時間相等按結束時間從小到大排序。

1 如果第乙個區間不是從1開始,則無法覆蓋,輸出-1。

2 令當前覆蓋到的時間time為開始時間為1的區間中結束時間的最大值。

3 從開始時間不為1的區間開始迴圈遍歷。

4 選擇合法區間中結束時間值最大的那個區間,合併到[1,time],合併後time為選擇的區間的結束時間。所謂合法區間是指區間的起始時間start<=time+1,這樣才能和區間[1,time]合併。如果沒有找到合法區間或者找到的區間結束時間比time小,則無法覆蓋,結束迴圈。

5 迴圈結束後,根據time是否大於等於t,輸出結果。

*/#include

#include

#include

#include

using namespace std;

struct qujian

;bool comp(qujian a,qujian b)

int main()

max=temp;//記錄最大的結尾

}if(tempelse

printf("%d\n",count);

}return 0;}/*

4 10

3 10

1 24 10

10 11

*//*

3 10

1 73 6

6 10

*//*

4 10

1 10

3 54 8

6 10

*/

堆區 棧區 靜態區 常量區還有???

常見的儲存區域可分為 由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,程式會一直占用記憶體,導致記憶體洩漏...

c 棧區 堆區 常量區

c 中棧區 堆區 常量區 由一道面試題目而學習 2009 04 28 21 01 include void main 對應的彙編 10 a c 1 00401067 8a 4d f1 mov cl,byte ptr ebp 0fh 0040106a 88 4d fc mov byte ptr ebp...

記憶體的使用 棧區 堆區 靜態區 唯讀區

記憶體的使用感覺好亂啊,需要整理一下!於是參考c primer與網上資源,整理如下 一 綜述 記憶體中的棧區分配的是區域性變數和函式的引數值的空間,棧的生長方向是從高往低的 堆區是向上增長的用於分配程式設計師申請的記憶體空間 比如new 申請的動態記憶體 注意它與資料結構中的堆是兩回事,分配方式倒是...