目錄貪心演算法求解
參考文章
題目傳送門
給定 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 表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示所需的點的最小數量。...