HDU - 2037 今年暑假不AC 贪心(求序列中不重叠子序列的最大值问题)

HDU2037 今年暑假不AC  贪心算法

大意:

每次测试数据输入一个n,然后输入n对的电视节目播放时间:开始时间及结束时间,

求这个人能看的最多的完整的节目数。

解题思路:

对于这道解题,是对每个节目的结束时间排序,目的是使剩余时间留下,再判断还能看几个节目。对节目时间的排序结束后,依次判断,这次要看的节目的开始时间是否大于上次看的节目的结束时间,若是大于,则这个节目时可以完整观看的,若是小于则是不能完整观看的,所以跳到下一个节目继续判断 。

例子:

12

1 3

3 4

0 7

3 8

15 19

15 20

10 15

8 18

6 12

5 10

4 14

2 9

0

 

对结束时间进行排序后的数组如下:从左到右为i=0~i=n-1

 

   1    3    0    3    2    5    6    4   10    8   15   15

   3    4    7    8    9   10   12   14   15   18   19   20

 

然后进行依次判断发现有5个节目时可以完整观看的,即上面的5组红色字体,接着便输出结果。

    

5

 

Code:

//HDU2037 今年暑假不AC   

#include<stdio.h>

#include<algorithm>

using namespace std;

int n;

struct show

{

    int s;

    int e;

}pro[110];

bool cmp(show a,show b)

{

    return a.e<b.e;

}

int main()

{

    while(scanf("%d",&n)!=EOF&&n)

    {

        int cnt=1,i;

        memset(pro,0,sizeof(pro));

        for(i=0;i<n;i++)

        {

            scanf("%d%d",&pro[i].s,&pro[i].e);

        }

        sort(pro,pro+n,cmp);

        int tmp=pro[0].e;

        for(i=1;i<n;i++)

            {

                if(pro[i].s>=tmp)

                    {

                    cnt++;

                    tmp=pro[i].e;

                    }

            }

        printf("%d\n",cnt);

    }

    return 0;

}

posted @ 2017-06-14 22:03  yzm10  阅读(176)  评论(0编辑  收藏  举报