演算法入門 區間貪心

2022-09-09 09:27:10 字數 1268 閱讀 3712

區間貪心

一、區間不相交問題

問題描述:給出n個開區間(x,y),要求從這些開區間中選擇盡可能多的開區間,使得這些開區間兩兩之間沒有交集

例如:對於(1,3)、(2,4)、(3,5)、(6,7)來說,可以選出最多的三個區間(1,3)、(3,5)、(6,7)

這就是區間選擇問題,所以在求解時,應該盡可能選擇小的區間,這樣才能包含更多的不相交區間

下面用書中一張圖來對演算法進行描述

首先a)中區間之間是包含關係,為了盡可能多的選擇區間,所以應該保留區間1

圖b)中,把所有包含區間處理完成以後,可以將剩餘區間進行排序,假設剩下的區間排序完成形成b)中情況,那麼就可以看出i2,i3和三個區間都相交,i1只和i2,i3相交,顯然選擇i1這種區間是目前最優的,所以應該優先選擇區間左端點最大的那個區間,如果這個區間的右端點與上乙個選取的區間不相交,那麼就應該保留這個區間,因為像圖b)中,當i1被選取以後,對i2,i3,i4的右端點和i1的左端點進行判斷是最便捷的方法。

下面討論怎麼過濾包含區間,可以先將所有區間排列成類似圖b)的形式,讓左端點從大到小排序,如果左端點相同,就按右端點從小到大排序,然後按排序的順序依次選擇區間,假設有區間x(6,7)和y(6,8)顯然區間x在區間y中,那麼肯定首先選擇區間x,而在排序演算法中x剛好是拍在y之前的。對於(2,4)和(3,4)也是同理。

二、區間選點問題

通過對上面的問題進行改變可以產生乙個區間選點的問題,要求在給出的所有區間中選出數個點(小於等於區間個數),使每個區間中至少存在乙個選出的點,區間為閉區間。其實這個問題就是對區間劃分的一種變形,主要思想還是要找出所有不相交的區間,然後從這些區間裡面選點,那麼根據上面**的思想,區間選點應該優先選擇區間左側的點,因為排序完成後,區間左邊界是最有可能和其他區間相交的地方,這樣即能選到當前區間的點,還有可能選到其他區間上的點。

對上述**進行修改時,只需要將i[i].y<=lastx改成小於就行,因為如果使用等號,那麼會選擇到兩個區間的左端點剛好等於右端點,就是說兩個區間剛好連續,那麼就會選擇重複的點。

演算法(貪心 區間分組)

給定n個閉區間 ai,bi 請你將這些區間分成若干組,使得每組內部的區間兩兩之間 包括端點 沒有交集,並使得組數盡可能小。輸出最小組數。輸入格式 第一行包含整數n,表示區間數。接下來n行,每行包含兩個整數ai,bi,表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示最小組數。資料範圍 1 n 10...

貪心 區間貪心

給出n個開區間 x,y 從中選擇盡可能多的開區間,使得這些開區間兩兩沒有交集。先對左端點 從大到小 排序,如果左端點相同就對右端點從小到大排序。區間不相交問題 include include using namespace std const int maxn 110 區間結構體 struct in...

區間排程 貪心演算法

一 找到數目盡可能多的相容任務 假設每個任務j從sj開始到fj結束。若要找到盡可能多的相容任務,只需要將所有任務按照結束時間排序,每次都選擇最早結束的那個任務。因為每次選最早結束的,則留給之後的時間就越多。在餘下的時間中與被選的那個任務衝突的任務最多也只能有乙個被選 代替現在被選的這個任務 但是留下...