2071 不相交子區間(貪心)

2021-10-05 23:54:37 字數 1017 閱讀 3575

給定 x 軸上 n(0輸入

輸入第一行是乙個正整數 n,表示線段個數。

接下來有 n 行,第 i 行有兩個空格隔開的整數,表示第 i 條線段兩個端點的座標。

輸出輸出乙個數,表示最多剩下的線段數。

輸入樣例

36 3

1 32 5

輸出樣例

2一開始的思路是先將線段排好序,從左往右找起。因為當前位置的一條線段有兩種可能,乙個是與下一條線段沒有重疊,那就可以數量直接加1;還有一種是有重疊,這個又可以分為兩種情況,一種是捨棄當前這一條,從下一條開始考慮起,一種是不捨棄,往後找到不重疊的那條開始接著考慮。但是超時了,**如下:

#includeusing namespace std;

struct nodeline[110];

int cmp(node a,node b)

/*int l=i+1,r=n,mid,tip=1;

while(l<=r)

else l=mid+1;

} if(line[tip].x>=line[i].y)

dfs(tip,ans+1); */ }}

int main()

sort(line+1,line+1+n,cmp);

dfs(1,0);

cout《我用二分查詢改進了一下查詢,但是也沒用。目前沒有任何改進思路了,所以開始考慮使用其他演算法,比如:貪心

每次都選結束時間最早的線段:

#includeusing namespace std;

struct nodeline[110];

int cmp(node a,node b)

sort(line+1,line+1+n,cmp);

for(int i=1;i<=n;i++)

if(line[i].x>=pre)

cout《其實一開始看到題目的什麼去掉盡量少的線段時,第一念頭就是貪心,但是又不知道怎麼貪,想來想去結果弄出來上面那個方法,還超時了。而現在這個貪法乍一想感覺理所當然可以的,真要我去弄個證明啥的也不會,還是需要多多學習啊

選擇不相交區間(貪心)

數軸上有n個區間 ai,bi 要求選擇盡量多個區間,使得這些區間兩兩沒有公共點。貪心策略 按照b1 b2 b3 的方式排序,然後從前向後遍歷,每當遇到可以加入集合的區間,就把它加入集合。集合代表解的集合 證明 我們對a1,a2 的關係分以下幾種情況考慮 1 a1 a2。此時區間2包含區間1。這種情況...

區間貪心之選擇不相交區間

區間相交問題 description 給定x軸上n個閉區間。去掉盡可能少的閉區間,使剩下的閉區間都不相交。給定n個閉區間,計算去掉的最少閉區間數。input 輸入第一行是正整數n n 100 表示閉區間數。接下來的n行中,每行有兩個整數 可以是負數 分別表示閉區間的兩個數端點。output 輸出去掉...

NYOJ 選擇不相交區間 貪心

那麼,對於該問題。就是給一系列的區間,求最多的區間,要求區間個數最多,這些區間不相交,需要注意的是這些區間都是閉區間。第一行乙個數n為區間個數 n 1000 接下來有n行,每行有兩個數a,b分別為區間的兩個端點,a,b在int範圍。eof結尾。輸出如樣例所示。2 1 10 10 11 31 10 1...