a.描述:
數軸上有n個開區間(ai, bi)。選擇盡量多個區間,使得這些區間兩兩 沒有公共點。
b.思路總結:
1.區間x完全包含y,選y
2.按照bi從小到大排序,從第乙個區間開始選
3.把所有和上乙個區間相交的區間排除在外
c.思路分析:
首先明確乙個問題:假設有兩個區間x,y,區間x完全包含y。那麼,選x是不划算的,因 為x和y最多只能選乙個,選x還不如選y,這樣不僅區間數目不會減少,而且給其他區間留出 了更多的位置。接下來,按照bi從小到大的順序給區間排序。
貪心策略是:一定要選第乙個 區間。
現在區間已經排序成b1≤b2≤b3…了,考慮a1和a2的大小關係。
情況1:a1>a2,如圖所示,
區間2包含區間1。前面已經討論過,這種情況下一 定不會選擇區間2。不僅區間2如此,以後所有區間中只要有乙個i滿足a1>ai,i都不要選。在 今後的討論中,將不考慮這些區間。
情況2:排除了情況1,一定有a1≤a2≤a3≤…,如圖所示。
如果區間2和區間1完全 不相交,那麼沒有影響(因此一定要選區間1),否則區間1和區間2最多只能選乙個。如果 不選區間2,區間1的1部分其實是沒有任何影響的(它不會擋住任何乙個區間),區間1的有效部 分其實變成了2部分,它被區間2所包含!由剛才的結論,區間2是不能選的。依此類推, 不能因為選任何區間而放棄區間1,因此選擇區間1是明智的。
選擇了區間1以後,需要把所有和區間1相交的區間排除在外,需要記錄上乙個被選擇的 區間編號。這樣,在排序後只需要掃瞄一次即可完成貪心過程,得到正確結果。
a.描述:
數軸上有n個閉區間[ai, bi]。取盡量少的點,使得每個區間內都至少有 乙個點(不同區間內含的點可以是同乙個)。
b.思路總結:
1.按b從小到大排序(b相同時a從大到小排序)
2.區間包含的情況 下,大區間不需要考慮。
3.取最後乙個點
c.思路分析:
如果區間i內已經有乙個點被取到,則稱此區間已經被滿足。受上一題的啟發,下面先 討論區間包含的情況。由於小區間被滿足時大區間一定也被滿足,所以在區間包含的情況 下,大區間不需要考慮。
把所有區間按b從小到大排序(b相同時a從大到小排序),則如果出現區間包含的情 況,小區間一定排在前面。第乙個區間應該取哪乙個點呢?此處的貪心策略是:取最後乙個 點,
根據剛才的討論,所有需要考慮的區間的a也是遞增的,可以把它畫成圖8-8的形式。如 果第乙個區間不取最後乙個,而是取中間的,如a點,那麼把它移動到最後乙個點b後,被 滿足的區間增加了,而且原先被滿足的區間現在一定被滿足。不難看出,這樣的貪心策略是 正確的。
a.描述:
數軸上有n個閉區間[ai, bi],選擇盡量少的區間覆蓋一條指定線段[s,t]。
b.思路總結:
1.每個區間在[s, t] 外的部分都應該預先被切掉
2.按照a從小到大排序,選擇起點在s的最長區間[ai,bi]
3.新的起點應 該設定為bi,忽略所有區間在bi之前的部分
c.思路分析:
本題的突破口仍然是區間包含和排序掃瞄,不過先要進行一次預處理。每個區間在[s, t] 外的部分都應該預先被切掉,因為它們的存在是毫無意義的。預處理後,在相互包含的情況 下,小區間顯然不應該考慮。
把各區間按照a從小到大排序。如果區間1的起點不是s,無解(因為其他區間的起點更 大,不可能覆蓋到s點),否則選擇起點在s的最長區間。選擇此區間[ai, bi] 後,新的起點應 該設定為bi,並且忽略所有區間在bi之前的部分,就像預處理一樣。雖然貪心策略比上題復 雜,但是仍然只需要一次掃瞄
s為當前有效起點(此前部分已被覆蓋),則 應該選擇區間2。
區間問題 區間選點 區間問題 貪心
玄學的貪心問題,一般全憑直覺。貪心問題沒有固定討論,沒有模板,見多了就好了,證明想法的正確性是很困難的,大多採用反證法。905.區間選點 貪心思路 證明 時間複雜度 o n logn o nlogn o nlog n include include using namespace std const...
貪心區間問題
1 選擇不相交問題 51nod1133 數軸上有n個開區間 ai,bi 盡量選擇多個區間,是的這些區間兩兩之間沒有共同點。include include include include define ll long long define maxn 100005 int n using namesp...
貪心 區間問題
區間選點 定n個閉區間 ai,bi ai,bi 請你在數軸上選擇盡量少的點,使得每個區間內至少包含乙個選出的點。輸出選擇的點的最小數量。位於區間端點上的點也算作區間內。輸入格式 第一行包含整數n,表示區間數。接下來n行,每行包含兩個整數ai,bi ai,bi 表示乙個區間的兩個端點。輸出格式 輸出乙...