您的位置:首页 > 其它

codevs 1643 线段覆盖 3(贪心+快排)

2017-05-25 23:00 337 查看
题目描述 Description

在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少。

输入描述 Input Description

输入格式

输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段。

输出描述 Output Description

输出格式

  输出文件仅包括1个整数,为k的最大值

样例输入 Sample Input

3

0 2

2 4

1 3

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

数据范围

对于20%的数据,n≤10;

对于50%的数据,n≤1000;

对于70%的数据,n≤100000;

对于100%的数据,n≤1000000,0≤ai<bi≤1000000。

思路:和线段覆盖 1思路一样,只不过数据变大了,不能暴力过。。。

代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=1000005;
struct node
{
int l,r;
}line
;
bool cmp(node a,node b)
{
return a.r<b.r;
}
int main()
{
int n,sum;
scanf("%d",&n);

for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x<y)
{
line[i].l=x;
line[i].r=y;
}
else
{
line[i].l=y;
line[i].r=x;
}
}
sort(line+1,line+1+n,cmp);
int r=line[1].r;
sum=1;
for(int i=2;i<=n;i++)
{
if(line[i].l>=r)
{
r=line[i].r;
sum++;
}
}
printf("%d\n",sum);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: