题目
思路
用贪心算法,我们每次都找到最早结束的同学,然后再找到跟之前找到不冲突的最早结束的,以此类推。贪心的证明就是因为最早结束的同学最多只会影响一个同学。所以一定是正确的。
代码
#define LOCAL
#include
#include
#include
using namespace std;
struct node {
int l,r,k=1;
};
int cmp(node a,node b) {
return a.r<b.r||a.r==b.r&&a.l<b.l;
}
int main() {
#ifdef LOCAL
freopen(“c:\BJZHC0\sale10.in”, “r”, stdin);
freopen(“c:\BJZHC0\sale10.out”, “w”, stdout);
#endif
int n,m;
cin >>m >> n;
node a[150010];
for(int i=0; i<n; i++) {
cin >> a[i] .l>> a[i].r;
}
sort(a,a+n,cmp);
int temp=0,count=2,key=0;
for(int ii=0; ii<2; ii++) {
for(int i=0; i<n; i++) {
if(a[i].k) {
temp=a[i].r;
key=i;
break;
}
}
for(int i=key; i<n; i++) {
if(a[i].l>=temp&&a[i].k) {
count++;
temp=a[i].r;
a[i].k=0;
}
}
}
cout<<count;
#ifdef LOCAL
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
#endif
return 0;
}