Week3 作業B 區間選點 貪心

2021-10-04 01:56:35 字數 708 閱讀 9050

數軸上有n個閉區間[ai,bi],選盡量少的點,使得每個區間內都至少有乙個點(不同區間內的點可以是同乙個)

貪心策略:按照b公升序a降序將區間排序,從前向後遍歷,當遇到還沒有點加入集合的區間時,加入該區間的右端點。

證明:對於有區間包含的情況,假設小區間為[x,y],大區間為[m,n],顯然x>m、y下面排除掉所有包含情況。若兩個區間有左/右某個端點相同,則一定屬於包含情況。若區間a比區間b右端點大,左端點小,則a一定包含b。所以,排除後,右端點嚴格公升序,同時左端點也是公升序的。如圖:

此種情況下,對於某乙個區間,選擇右端點,可以盡可能多的滿足後面更多未被包含區間的需求。因此,貪心策略是正確的。

#include#include#includeusing namespace std;

struct range

};range ran[105];

int main()

sort(ran,ran+n);

int cnt=0;

int temp=ran[0].b; cnt++;

for(int i=1;i=ran[i].a && temp<=ran[i].b)else

} cout<

return 0;

}

區間選點 貪心 Week3作業B題

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 輸入 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 輸出 乙個整數,代表選點的數目 樣例 input 21 5 4 6output 1input 31...

區間選點(week3 作業B)

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 input 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 output 乙個整數,代表選點的數目 examples input 21 5 4 6out...

Week3作業B 區間選點

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 input 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 output 乙個整數,代表選點的數目 sample input 21 5 4 6sampl...