【来源】
一本通题库-1429
LibreOJ-10007
vjudge
【题目描述】
在一个数轴上有 n n n条线段,现选取其中 k k k条线段使得这 k k k条线段两两没有重合部分,问最大的 k k k为多少?
【输入格式】
第一行为一个正整数 n n n,下面 n n n行每行 2 2 2个数字 a i a_i ai, b i b_i bi,描述每条线段。
【输出格式】
输出文件仅包括 1 1 1个整数,为 k k k的最大值。
【输入样例】
3
0 2
2 4
1 3
【输出样例】
2
【数据范围】
对于20%的数据, n ≤ 10 n≤10 n≤10。
对于50%的数据, n ≤ 1000 n≤1000 n≤1000。
对于70%的数据, n ≤ 100000 n≤100000 n≤100000。
对于20%的数据, n ≤ 1000000 n≤1000000 n≤1000000, 0 ≤ a i < b i ≤ 1000000 0≤a_i<b_i≤1000000 0≤ai<bi≤1000000。
【解析】
贪心。
和前面的例题解析相似,此处不提。
【代码】
#pragma GCC optimize(3,"Ofast","inline")
#pragma G++ optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define RI register int
#define re(i,a,b) for(RI i=a; i<=b; i++)
#define ms(i,a) memset(a,i,sizeof(a))
#define MAX(a,b) (((a)>(b)) ? (a):(b))
#define MIN(a,b) (((a)<(b)) ? (a):(b))
using namespace std;
typedef long long LL;
const int N=1e6+5;
struct Node {
int a,b;
bool operator < (const Node &rhs) const {
return b<rhs.b;
}
} line[N];
int n;
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%d%d",&line[i].a,&line[i].b);
sort(line+1,line+n+1);
int ans=1;
int tmp=line[1].b;
for(int i=2; i<=n; i++) {
if(line[i].a>=tmp) {
tmp=line[i].b;
ans++;
}
}
printf("%d\n",ans);
return 0;
}