//区间调度 /* 问题描述:有N项工作,每项工作有开始时间si和结束时间ti,让你选择最多的工作,工作之间不存在时间交叉。 输入: 5 1 3 2 5 4 7 6 9 8 10 输出: 3 */ #include<iostream> #include<algorithm> using namespace std; const int MAX = 100000; int N, s[MAX], t[MAX];//输入,s开始时间,t结束时间 pair<int, int> itv[MAX];//用于对工作排序的pair数组 int main() { cin>>N; int i; for(i=0;i<N;i++) cin>>itv[i].second>>itv[i].first;//便于以结束时间排序,所以改存顺序 /*cin>>s[i]>>t[i];*/ sort(itv, itv + N); int ans = 0, t = 0; for(i = 0; i < N; i++){ if(t < itv[i].second){ ans++; t = itv[i].first; } } cout<<ans<<endl; system("pause"); return 0; } /* 贪心算法之所以能用,是基于以“结束时间最早”为前提的。但是这是需要你分析和证明的,你要先想明白为什么 按结束时间最早排序才是正确的。 1.因为结束时间最早,所以取相同数量的工作肯定它最早结束或至少不晚。 2.如果后面还有工作,那么加入到结束最早算法的空间更大。 因此就不会存在比它更多工作的可能。 */