目錄貪心演算法求解
新的思路
參考文章
給定 n 個閉區間首先所有區間按照左端點排序[ai,bi]
,請你將這些區間分成若干組,使得每組內部的區間兩兩之間(包括端點)沒有交集,並使得組數盡可能小。輸出最小組數。
輸入格式
第一行包含整數 n,表示區間數。
接下來 n 行,每行包含兩個整數 ai,bi,表示乙個區間的兩個端點。
輸出格式
輸出乙個整數,表示最小組數。
資料範圍
\(1≤n≤10^5\)
\(−10^9≤ai≤bi≤10^9\)
輸入樣例:
輸出樣例:3
-1 1
2 43 5
2
維護乙個小根堆h,堆裡存的是每組區間的最右端點
然後遍歷所有區間,設當前的區間左端點是l
#include#include#include#includeusing namespace std;
typedef pairpii;
const int n = 100010;
pii s[n];
int n;
int main()
sort(s, s+n); // 按左端點從小到大排序
// 小根堆,只支援int
priority_queue, greater> h; // 用來存每組區間最右端點
for(int i = 0; i < n; i++)
else // 否則放入右端點最小的那個區間
}cout << h.size() << endl;
return 0;
}
看了一下,貌似是求最大」區間厚度的問題。大家可以把這個問題想象成活動安排問題
有若干個活動,第i個活動開始時間和結束時間是\([si,fi]\),同乙個教室安排的活動之間不能交疊,求要安排所有活動,少需要幾個教室?
有時間衝突的活動不能安排在同一間教室,與該問題的限制條件相同,即最小需要的教室個數即為該題答案。
我們可以把所有開始時間和結束時間排序,遇到開始時間就把需要的教室加1,遇到結束時間就把需要的教室減1,在一系列需要的教室個數變化的過程中,峰值就是多同時進行的活動數,也是我們至少需要的教室數。
c++ **
#include #include using namespace std;
const int n = 100100;
int n;
int b[2 * n], idx;
int main()
sort(b, b + idx);
int res = 1, t = 0;
for(int i = 0; i < idx; i ++)
printf ("%d\n", res);
return 0;
}
AcWing 906 區間分組
這個區間貪心問題,是要按照區間左端點排序。和之前區間問題一樣,我們需要分情況討論貪心決策 1.如果乙個區間的左端點比當前每乙個組的最右端點都要小,那麼意味著要開乙個新區間了,這個條件還可以優化成,乙個區間左端點比最小組的右端點都要小就開乙個新組。2.如果乙個區間的左端點比最小組的右端點大,那麼就放在...
Acwing 906 區間分組
906.區間分組 給定n個閉區間 ai,bi 請你將這些區間分成若干組,使得每組內部的區間兩兩之間 包括端點 沒有交集,並使得組數盡可能小。輸出最小組數。輸入格式 第一行包含整數n,表示區間數。接下來n行,每行包含兩個整數ai,bi,表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示最小組數。資料...
Acwing 905 區間選點
給定n個閉區間 ai,bi 請你在數軸上選擇盡量少的點,使得每個區間內至少包含乙個選出的點。輸出選擇的點的最小數量。位於區間端點上的點也算作區間內。輸入格式 第一行包含整數n,表示區間數。接下來n行,每行包含兩個整數ai,bi 表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示所需的點的最小數量。...