题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2037
思路
想要看的节目尽可能的多,则首先要将节目按照结束时间从早到晚排序,因为一个节目越早结束,留给后面的节目的时间就越多,也就能看到更多的节目。如果按照开始时间从早到晚排序,由于节目可能持续很长时间,所以将会导致最后的结果不准确。举个例子,有三个节目(1,10),(3,5),(6,8),按开始时间从早到晚排序,则只能看1个节目(1,10),而按照结束时间从早到晚排序,则能看2个节目(3,5)和(6,8)。
代码
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <vector> 6 using namespace std; 7 8 struct Node 9 { 10 int s, e; 11 12 Node(int s, int e):s(s), e(e) {} 13 bool operator < (const Node& node) const 14 { 15 return e < node.e; //将节目按照结束时间从早到晚排序 16 } 17 }; 18 vector<Node> v; 19 20 int main() 21 { 22 //freopen("hdoj2037.txt", "r", stdin); 23 int n; 24 while(cin >> n && n) 25 { 26 v.clear(); 27 int s, e; 28 for(int i=0; i<n; i++) 29 { 30 cin >> s >> e; 31 v.push_back(Node(s, e)); 32 } 33 34 sort(v.begin(), v.end()); 35 int ans = 1; 36 int t = v[0].e; 37 for(int i=0; i<n; i++) 38 { 39 if(v[i].s >= t) 40 { 41 ans++; 42 t = v[i].e; 43 } 44 } 45 cout << ans <<endl; 46 } 47 return 0; 48 }