题目 2342: [信息学奥赛一本通-T1429]线段
时间限制: 1Sec 内存限制: 128MB 提交: 38 解决: 14
题目描述
在一个数轴上有n条线段,现选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少?
输入
第一行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段。
输出
输出文件仅包括1个整数,为k的最大值。
样例输入
3
0 2
2 4
1 3
样例输出
2
代码刚刚贴着时间过,应该有优化的算法.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node{
int left,right;
}edge[1000005];
int dp[1000005];
int n;
bool cmp1(node x,node y)
{
return x.left<y.left;
}
bool cmp2(node x,node y)
{
return x.right<y.right;
}
int main()
{
memset(dp,0,sizeof(dp));
scanf("%d",&n);
int t = 0;
for(int i = 0;i<n;i++)
{
scanf("%d %d",&edge[i].left,&edge[i].right);
}
sort(edge,edge+n,cmp1);
sort(edge,edge+n,cmp2);
//离散化处理
int sum = 0;
dp[0] = 1;
int k = edge[0].right;
for(int i = 1;i<n;i++)
{
int u = edge[i].left ;
dp[i] = dp[i-1];
if(u>=k)
{
dp[i] = dp[i-1]+1;
k = edge[i].right;
}
if(dp[i]>sum) sum = dp[i];
}
cout<<sum<<endl;
return 0;
}