給出n個開區間(x, y),從中選擇盡可能多的開區間,使得這些開區間兩兩沒有交集。
先對左端點 從大到小 排序,如果左端點相同就對右端點從小到大排序。
// 區間不相交問題
#include #include using namespace std;
const int maxn = 110;
// 區間結構體
struct intevali[maxn];
/*區間排序函式:
先對左端點 從大到小 排序
左端點相同的 從小到大 排序*/
bool cmp(inteval a, inteval b)
int main()
} // 對所有區間進行排序(先按 左端點 從大到小排序,再按 右端點 從小到大排序)
sort(i, i+n, cmp);
// ans 記錄不相交區間個數,lastx記錄上乙個被選中區間的 左端點
int ans = 1, lastx = i[0].x; // 預設第乙個區間被選中
for(int i = 1; i < n; i++) }
printf("%d\n", ans);
return 0;
}
給出 n 個閉區間 [x, y],求最少需要確定多少個點,才能使每個閉區間中都存在乙個點。
如果閉區間 i1被 i2 包含,那麼在 i1 中取點可以保證這個點一定在 i2內。把所有區間按左端點從大到小排序,只要取左端點,這樣這個點就能覆蓋到盡可能多的的區間。
(貪心)整數區間
題目 找到乙個含元素個數最少的集合,使得對於每乙個區間,都至少有乙個整數屬於該集合,輸出該集合的元素個數。輸入 首行包括區間的數目n,1 n 10000,接下來的n行,每行包括兩個整數a,b,被一空格隔開,0 a b 10000,它們是某乙個區間的開始值和結束值。輸出 第一行集合元素的個數,對於每乙...
區間貪心總結
一 線段覆蓋 n個開區間 ai,bi 選擇盡量多個區間,使得這些區間兩兩不相交 右端點排序 兼顧左端點 再從左到右遇到不相交的就選 sort he 1,he n 1,cmp int tot 0,now 1000 for int i 1 i n i printf d tot 二 區間選點 n個閉區間 ...
貪心 區間選擇
貪心 區間選擇 區間選擇大意 有n個區間,區間可以重疊,要求你選出最多的滿足要求的區間,要求這些區間彼此不能重疊 思路 首先,我們可以把總區間分成兩個部分 從中間某一點一批為二 左邊那部分為已定區域,右邊為待定區域 在已定區間已經得到最優解時,我們需要整體最優,明顯有這樣乙個策略 已定區域的末端點越...