有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?
输入
第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9)
输出
输出最多可以选择的线段数量。
输入示例
3 1 5 2 3 3 6
输出示例
2
请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案。
不同语言如何处理输入输出,请查看下面的语言说明。
题解:
简单的贪心。先将结构体数组排序,令结束时间快,活动进行的短的活动排前面。定义y,令y为第一个活动的结束时间。然后搜索当。一个活动的开始时间在该y之后则令y为该活动结束时间,且答案加1.
#include<bits/stdc++.h>
using namespace std;
#define M 20005
int n;
struct node{
long st,ed;
}a[M];
int cmp(node x,node y){//让结束时间小的排前面 如果当相同时则开始时间的的排前面。这样就让活动时间短结束的快的安排在前面
if(x.ed!=y.ed)return x.ed<y.ed;
else return x.st>y.st;
}
int main()
{
int ans=1;
long y;
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i].st>>a[i].ed;
sort(a,a+n,cmp);
y=a[0].ed;
for(int i=1; i<n; i++){
if(y<=a[i].st){
ans++;
y=a[i].ed;
}
}
cout<<ans;
return 0;
}