看到了这个题目,想到了曾经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,是动态数组,用起来很方便,以后就尽量使用吧!