AcWing 907 區間覆蓋

2022-10-06 16:24:20 字數 1386 閱讀 8349

目錄貪心演算法求解

參考文章

題目傳送門

給定 nn 個閉區間 [ai,bi][ai,bi] 以及乙個線段區間 [s,t][s,t],請你選擇盡量少的區間,將指定線段區間完全覆蓋。

輸出最少區間數,如果無法完全覆蓋則輸出 −1−1。

輸入格式

第一行包含兩個整數 ss 和 tt,表示給定線段區間的兩個端點。

第二行包含整數 nn,表示給定區間數。

接下來 nn 行,每行包含兩個整數 ai,biai,bi,表示乙個區間的兩個端點。

輸出格式

輸出乙個整數,表示所需最少區間數。

如果無解,則輸出 −1−1。

資料範圍

1≤n≤1051≤n≤105,

−109≤ai≤bi≤109−109≤ai≤bi≤109,

−109≤s≤t≤109−109≤s≤t≤109

輸入樣例:

1 5

3-1 3

2 43 5

輸出樣例:
2
將所有線段按左端點排序

選擇能夠覆蓋當前st的所有線段中右端點最大的

如果沒有則說明不能覆蓋

有的話將當前st更新為該最大右端點

如果選擇了當前最大右端點之後,該右端點大於ed,說明覆蓋完成,直接break

#include#include#include#includeusing namespace std;

typedef long long ll;

typedef pairpii;

const int n = 100010;

const int inf = 1e9 + 7;

vectorranges;

int st, ed;

int n;

bool cmp(pii a, pii b)

int main()

); }

sort(ranges.begin(), ranges.end(), cmp);

bool flag = false;

int res = 0;

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

if(r < st) break; //如果沒有能覆蓋當前st的線段,說明不能覆蓋

res ++; // 選擇這條右端最靠右的線段

if(r >= ed)

st = r;

i = j - 1;

} if(flag) cout << res << endl;

else cout << -1 << endl;

return 0;

}

\(o(nlogn)\)

1751 區間覆蓋問題

time limit 1000 ms memory limit 65536 kib problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給定的實直線上的n個點和閉區間的長度k,設計解此問題的有效演...

4 10區間覆蓋問題

問題描述 設x2,x2,xn是實直線上的n個點。用固定長度的閉區間覆蓋著n個點,至少需要多少個這樣的長度閉區間?設計解決此問題的有效演算法。演算法設計 對於給定的實直線上的n個點和閉區間的長度k,計算覆蓋點集的最少區間數。資料輸入 第一行有兩個整數n和k,表示有n個點,且固定長度閉區間的長度為k。接...

Acwing 905 區間選點

給定n個閉區間 ai,bi 請你在數軸上選擇盡量少的點,使得每個區間內至少包含乙個選出的點。輸出選擇的點的最小數量。位於區間端點上的點也算作區間內。輸入格式 第一行包含整數n,表示區間數。接下來n行,每行包含兩個整數ai,bi 表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示所需的點的最小數量。...