看到了这个题目,想到了曾经AC过了的一个hdoj上面的一个题目,2037 今年暑假不AC,一样的思路,先是对开始时间排个序,然后根据结束时间是否大于开始时间进行选择,这就是思路,整个就是利用的贪心算法。

贴一下代码吧:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX 10
typedef struct act
{
    int start;
    int end;
}act;
int cmp(const act &a,const act &b )
{
    return a.end < b.end;
}
int main(void)
{
    int m,n;
    act a[MAX],tmp;
    int i,j;
    //memset(a,0,sizeof(a)*MAX);
    scanf("%d",&m);
    while(m--)
    {
        int sum=1;
        scanf("%d",&n);                      //输入活动数目;
        for(i = 0; i < n; i++)
        {
            scanf("%d %d",&a[i].start,&a[i].end);
        }
        sort(a,a+n,cmp);                    //按照结束时间从小到大排序;
        tmp=a[0];
         for(j = 0;j < n-1; j++)
            if(tmp.end <= a[j+1].start)
         {
             sum++;
             tmp = a[j+1];
         }
         printf("%d\n",sum);
    }
    return 0;
}

但是发现一个问题,看见了别人的好的代码以后,突然理解了vector的用法,在使用数组的时候最好是使用vector,贴一下别人的代码吧!

#include<stdio.h>
#include <vector>
#include<algorithm>
#include<math.h>
using namespace std;
struct activ
{
    int begin;
    int end;
};
bool cmp( activ a,activ b)
{
    return a.end<b.end;
}
int main()
{
    //freopen("1.txt","r",stdin);
    int n;
    scanf("%d",&n);
    while (n--)
    {
        int m;
        scanf("%d",&m);
        vector<activ> vec;
        for(int i=0;i<m;i++)
        {
            activ a;
            scanf("%d%d",&a.begin,&a.end);
            vec.push_back(a);
        }
        sort(vec.begin(),vec.end(),cmp);
        int count=vec.size();
        int k=0;
        for (int i=1;i<vec.size();i++)
        {
            if(vec[i].begin <= vec[k].end)
                count--;
            else k=i;
        }
        printf("%d\n",count);
    }
    return 0;
}

使用了vector,是动态数组,用起来很方便,以后就尽量使用吧!