hdu 2037 今年暑假不AC
题解:贪心法 选择不相交区间
先将所有的电视节目按照结束时间的早晚排序,排好序后,第一个节目是必须选的,因为他结束时间最早,最不可能与其他节目重叠。将该节目和与它重叠的节目删除(这样写是为了好理解,写程序是可以不删除),那么剩下的节目的第一个节目就成了必选节目,再删除,再选......一直到没有节目为止,就可得到正解。
代码如下:
#include <cstdio> #include <algorithm> typedef struct TV { int Ti_s, Ti_e; bool operator <(const TV & x)const {//为了使sort函数是按照节目的结束时间排序的 return Ti_e < x.Ti_e; } }tv[101]; int main() { int n, i, cur, cnt; tv A;//定义节目数组 while (scanf("%d", &n) && n) { cur = 0; cnt = 1; for (i=0; i<n; i++) scanf("%d%d", &A[i].Ti_s, &A[i].Ti_e); std::sort(A, A+i); for (i=1; i<n; i++) { if (A[cur].Ti_e <= A[i].Ti_s) {//若当前节目的结束时间与第i个节目不重叠 cur = i;//第i个节目看做当前第一个节目,相当于删除了以前的节目 cnt++;//完整节目计数 } } printf("%d\n", cnt); } return 0; }