区间选点
-
题意:
数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个 -
输入输出:
Input
第一行1个整数N(N<=100),第2~N+1行,每行两个整数a,b(a,b<=100)
Output
一个整数,代表选点的数目
-
解题思路:由于要选尽量少的点满足所有区间,所以重点是要判断有没有重叠部分。自定义结构体node记录区间的两个端点,用cmp函数将所有区间的按照小的端点升序排列,从第一个区间开始依次向后比较,如果前一个区间的y小于后一个区间的x,即没有重叠部分时,计数器加一。如果有重叠部分,则将后一个区间的y更新为当前两个区间中较大的y,继续向后比较。最后输出计数器的值,就是最小的点数。
-
代码实现:
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int x,y;
}a[1000];
//升序
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i].x>>a[i].y;
sort(a,a+n,cmp);
int count=1;//计数器
for(int i=0;i<n;i++)
{
if(a[i].y<a[i+1].x)
count++;
else
a[i+1].y=min(a[i].y,a[i+1].y);
}
cout<<count<<endl;
}
}