數軸上有n個區間[ai,bi],要求選擇盡量多個區間,使得這些區間兩兩沒有公共點。
貪心策略:
按照b1<=b2<=b3…的方式排序,然後從前向後遍歷,每當遇到可以加入集合的區間,就把它加入集合。(集合代表解的集合)
證明:我們對a1,a2……的關係分以下幾種情況考慮:
1、a1>a2。 此時區間2包含區間1。這種情況下顯然不會選擇區間2,因為選擇區間1會留下更多的剩餘空間。
不僅區間2如此,以後所有區間中只要有乙個 i 滿足a1 > ai,i 都不要選。
即此種情況下,選擇區間1是明智的,與策略一致。
2、排除情況1後,一定有a1<=a2<=a3……。
在此條件下,如圖所示,不論區間1、2的相對位置如何,選擇區間1都會為以後的選擇留下更大的剩餘空間。
從而在此種情況下, 因此選擇區間1也是明智的,與策略一致。
經典例題:活動安排問題->
附**。
#include #include using namespace std;
struct extent
}a[10002];
int main()
{ int z,n,cnt,end;
scanf("%d",&z);
while(z--)
{cnt = 0;
end = -1;
scanf("%d",&n);
for(int i=0;i
區間貪心之選擇不相交區間
區間相交問題 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...
貪心 選擇不相交區間問題
1.p1803 凌亂的yyy 線段覆蓋 題目描述 現在各大 oj 上有 n 個比賽,每個比賽的開始 結束的時間點是知道的。yyy 認為,參加越多的比賽,noip 就能考的越好 假的 所以,他想知道他最多能參加幾個比賽。由於 yyy 是蒟蒻,如果要參加乙個比賽必須善始善終,而且不能同時參加 2 個及以...