关于上一题的线段覆盖问题,除了用那种逐一情况排除以外,还可以用贪心算法进行计算,适用于数据较大不方便进行双层循环时,当然数据小时肯定可以啦~好了,上代码~
#include<iostream>
#include<cstdio>
#include <algorithm>
using namespace std;
struct point
{
int l,r;
}d[1100006];
bool cmp(const struct point &a,const struct point &b)
{
return a.r<b.r;
}
int main()
{
int n,a;
int counter=0;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d %d",&d[i].l,&d[i].r);
if(d[i].l>d[i].r) swap(d[i].l,d[i].r);
}
sort(d,d+n,cmp);//按纵坐标升序排列
a=d[0].r;
for(int i=1;i<n;++i)
{
if(d[i].l>=a)//线段不重合即加一
{
counter++;
a=d[i].r;
}
}
printf("%d\n",counter+1);//一开始的d[0].r也要算进去,故加一
return 0;
}