问题描述
有一个监控工程:在一条长度为L的笔直的公路上安装若干个摄像头,用于监控交通状况。我们可以把这条公路看作数轴[0,L]。
何老板承包了这项工程,但交管部门对摄像头的安置提出了n个要求,每个要求形如[x,y],表示在[x,y]这段区间至少要安置一个摄像头。
何老板想要用尽可能少的成本完成这项工程,因此,他想知道,最少需要安装多少个摄像头?
输入格式
第一行,一个整数n,表示有n个要求需要满足。
接下来n行,每行两个整数x和y,表示一个要求,即[x,y]这段区间至少要求一个摄像头。
输出格式
一行,一个整数,表示最少所需摄像头的个数。
样例输入
4
3 6
2 4
0 2
4 7
样例输出
2
提示
1<=n<=100000
0<=x<=y<=L<=1000000000
这道题是经典的分割类贪心问题。
审题,题目要求安装的摄像头尽量少。
先排序每个摄像头的左端点,要尽量在区域重合的情况下右端点尽量长,代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001],n,x,ans;
void qSort(int x,int y)
{
int i,j,mid1,mid2,t;
i=x;
j=y;
mid1=b[(x+y)/2];
mid2=a[(x+y)/2];
while(i<=j)
{
while(b[i]<mid1||(b[i]==mid1)&&(a[i]<mid2))i++;
while(b[j]>mid1||(b[j]==mid1)&&(a[j]>mid2))j--;
if(i<=j)
{
t=b[j];
b[j]=b[i];
b[i]=t;
t=a[j];
a[j]=a[i];
a[i]=t;
i++;
j--;
}
}
if (x<j) qSort(x,j);
if (i<y) qSort(i,y);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
}
qSort(1,n);
for (int i=1,x=-1;i<=n;i++)
{
if (x>=a[i])
{
continue;
}
ans++;
x=b[i];
}
cout<<ans<<endl;
return 0;
}