AcWing 906 區間分組

2022-09-25 07:18:08 字數 1558 閱讀 8784

目錄貪心演算法求解

新的思路

參考文章

給定 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 表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示所需的點的最小數量。...