题目描述
给定n个v闭区间[ai,bi],在数轴上选尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。
做法
①将每个区间按右端点从小到大排序
②从前往后依次枚举每个区间
如果当前区间包含该点,则直接pass
否则,选择当前区间的右端点
证明
按照这个做法的结果是Ans,Cnt是某种可行的方案
那么可以得出Ans<=Cnt
那么在任意两个区间都没有交集的时候,按照上述贪心做法得出Ans>=Cnt
Ans = Cnt 得到了最优解
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
struct NODE
{
int Left;
int Right;
}node[N];
//按右端点从小到大排序
bool Cmo(NODE &a, NODE &b)
{
return a.Right<b.Right;
}
int main(int argc, char** argv)
{
int n;
scanf("%d",&n);
//读取所有区间
for(int i = 0; i < n; i++)
{
scanf("%d%d", &node[i].Left, &node[i].Right);
}
//记录得用多少个点
int Cnt = 0;
int End = -2e9;
for(int i = 0; i < n; i++)
{
if(node[i].Left > End)
{
Cnt++;
End = node[i].Right;
}
}
printf("%d\n",Cnt);
return 0;
}