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;
}
浙公网安备 33010602011771号