看到了这个题目,想到了曾经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,是动态数组,用起来很方便,以后就尽量使用吧!
转载于:https://blog.51cto.com/liu168ad/1391544