网泰网站建设网络/常州百度推广公司
问题 H: 线段
时间限制: 1 Sec 内存限制: 128 MB
提交: 3 解决: 2
[提交][状态][讨论版][命题人:add_zmx]
题目描述
在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少。
输入
输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段。
输出
输出文件仅包括1个整数,为k的最大值
样例输入
30 22 41 3
样例输出
2
提示
对于20%的数据,n≤10;
对于50%的数据,n≤1000;
对于70%的数据,n≤100000;
对于100%的数据,n≤1000000,0≤ai<bi≤1000000。
贪心中的区间调度问题,要使选取的线段数量最多,只需要在满足与前一个线段不重合的情况下,每次选择右端点相对靠前的线段,这样能使数轴上余下的长度更长,选择的余地更大
这道题要用scanf,cin会TLE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int n,ans=0;
struct line//定义线段结构体
{int le;//左端点int ri;//右端点
}l[1000000];
int cmp(line x,line y)
{return x.ri<y.ri;
}
int main()
{scanf("%d",&n);//n条线段for(int i=0;i<n;i++)scanf("%d%d",&l[i].le,&l[i].ri);//输入每条线段的左端点和右端点sort(l,l+n,cmp);//根据线段的右端点位置排序int start=0;//数轴起始位置为0for(int i=0;i<n;i++){if(l[i].le>=start)//除端点外,两条线段不重合{start=l[i].ri;//更新后面线段的左端点从当前选择线段的右端点开始往后ans++;//线段数量+1}}printf("%d\n",ans);return 0;
}