关于上一题的线段覆盖问题,除了用那种逐一情况排除以外,还可以用贪心算法进行计算,适用于数据较大不方便进行双层循环时,当然数据小时肯定可以啦~好了,上代码~
#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; }