最大不相交區間數 最少區間數覆蓋問題 貪心思想

2022-05-20 11:27:55 字數 1673 閱讀 4422

最大不相交區間數的一道題是hdu2037

題目給出n個區間,問最多有多少個區間沒有重疊,只需要對區間右端點進行排序就行,因為乙個節目結束得早的話就會為其他節目留下更多的時間,如果選擇對節目的開始時間進行排序的話就會導致有乙個節目遲遲不結束使得其他節目又沒法開始的現象。右端點最小的第乙個區間時一定要選的。這個可以簡單地將其他右端值更大的區間跟他交換,就會發現不會產生更多的區間數,只會小於等於我們貪心方案選出的區間數量。

**如下:

1 #include2

using

namespace

std;

3 typedef unsigned int

ui;4 typedef long

long

ll;5 typedef unsigned long

long

ull;

6#define pf printf

7#define mem(a,b) memset(a,b,sizeof(a))

8#define prime1 1e9+7

9#define prime2 1e9+9

10#define pi 3.14159265

11#define lson l,mid,rt<<1

12#define rson mid+1,r,rt<<1|1

13#define scand(x) scanf("%llf",&x)

14#define f(i,a,b) for(int i=a;i<=b;i++)

15#define scan(a) scanf("%d",&a)

16#define mp(a,b) make_pair((a),(b))

17#define p pair18

#define dbg(args) cout<<#args<<":"<19

#define inf 0x7ffffff

20 inline int

read()

24while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'

0',ch=getchar();

25return ans*w;26}

27int

n,m,t;

28const

int maxn=1e4+10;29

struct

nodep[maxn];

32bool cmp(node& a,node&b)33

36int

main()

3747 p[0].r=0

;48 sort(p+1,p+n+1

,cmp);

49int ans=0;50

int last=0

;51 f(i,1

,n)5258}

59 pf("

%d\n

",ans);60}

61 }

最少區間數覆蓋問題,給定乙個長度n和m個區間,要求用最少的區間將長度為n的區間完全覆蓋。

策略是這樣的:首先設定區間的最右端點maxr=0,掃瞄所有的區間,取得最左端值小於等於maxr且最右端值最大的區間,並且更新maxr的值為這個區間的最右端值,這樣迭代下去,直到maxr大於等於n。這也是一種貪心策略,每一步都用可能的最長的區間去覆蓋,最終一定能得到最少區間數量覆蓋。

最大不相交區間數量

給定 n n n 個閉區間 ai bi ai,bi ai,bi 請你在數軸上選擇若干區間,使得選中的區間之間互不相交 包括端點 輸出可選取區間的最大數量。輸入格式 第一行包含整數 n n n,表示區間數。接下來 n n n 行,每行包含兩個整數 ai,bi ai,bi ai,bi,表示乙個區間的兩個...

區間問題 最大不相交區間數量 區間問題 貪心

玄學的貪心問題,一般全憑直覺。貪心問題沒有固定討論,沒有模板,見多了就好了,證明想法的正確性是很困難的,大多採用反證法。區間問題無非左端點 右端點 左右端點排序 908.最大不相交區間數量 本題和 區間問題 區間選點 區間問題 貪心 一模一樣,乙份 交兩遍就行了。貪心思路和證明思路都一致,簡單對問題...

AcWing 908 最大不相交區間數量

題目描述 給定n個閉區間 ai,bi 請你在數軸上選擇若干區間,使得選中的區間之間互不相交 包括端點 輸出可選取區間的最大數量。輸入格式 第一行包含整數n,表示區間數。接下來n行,每行包含兩個整數ai,bi,表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示可選取區間的最大數量。資料範圍 1 n ...