一.区间选点
题目来源:区间选点
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
struct Range
{
int l, r;
bool operator< (const Range &W)const
{
return r < W.r;
}
}range[N];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d%d", &range[i].l, &range[i].r);
sort(range, range + n);
int res = 0, ed = -2e9;
for (int i = 0; i < n; i ++ )
if (ed < range[i].l)
{
res ++ ;
ed = range[i].r;
}
printf("%d\n", res);
return 0;
}
二.最大不相交区间数量
题目来源:最大不相交区间数量
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
struct Range
{
int l, r;
bool operator< (const Range &W)const
{
return r < W.r;
}
}range[N];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d%d", &range[i].l, &range[i].r);
sort(range, range + n);
int res = 0, ed = -2e9;
for (int i = 0; i < n; i ++ )
if (ed < range[i].l)
{
res ++ ;
ed = range[i].r;
}
printf("%d\n", res);
return 0;
}
三.区间分组
题目来源:区间分组
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;
const int N = 100010;
int n;
struct Range
{
int l, r;
bool operator< (const Range &W)const
{
return l < W.l;
}
}range[N];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
{
int l, r;
scanf("%d%d", &l, &r);
range[i] = {l, r};
}
sort(range, range + n);
priority_queue<int, vector<int>, greater<int>> heap;//存储每组区间的最大max_r
for (int i = 0; i < n; i ++ )
{
if (heap.empty() || heap.top() >= range[i].l)//另开辟一个区间
{
heap.push(range[i].r);
}
else
{
heap.pop();
heap.push(range[i].r);
}
}
printf("%d\n", heap.size());
return 0;
}
/*
-7 6
-6 0
-4 -2
-4 6
7 9
*/
四.区间覆盖
题目来源:区间覆盖
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n;
struct Range{
int l, r;
bool operator < (const Range & R) const{
return l < R.l;
}
}range[N];
int main(){
int st, ed;
cin >> st >> ed >> n;
for(int i = 0; i < n; i ++) cin >> range[i].l >> range[i].r;
sort(range, range + n);//将各个区间按左端点从小到大排序
int res = 0;
bool success = false ;//bool success;默认0,false
for(int i = 0 ; i < n; i ++)
{
int j = i, r = -2e9;
while(j < n && range[j].l <= st)
{
//找到在指定区间左侧且右端点最靠右的区间
r = max(r, range[j].r);
j ++;
}
if(r < st)
{
//所有区间的有端点均小于指定区间左端点,即无解
success=false;
break;
}
res ++;
if(r >= ed)
{
//已经找到答案
success = true;
break;
}
i = j - 1;
st = r;
}
//为什么开bool呢:
//数据:
//1 5
//2
//-1 2
//2 4
//最后一步的r最大是4,st=2,ed=5不满足
/*
if(r < st)
{
//所有区间的有端点均小于指定区间左端点,即无解
success=false;
break;
}
if(r >= ed)
{
//已经找到答案
success = true;
break;
}
*/
//故res一直++,最后得到res=2
//因此开辟bool记录答案
//找到答案true,否则false
if(success) cout << res << endl;
else cout << "-1" << endl;
return 0;
}