2 2 1 10 10 11 3 1 10 10 11 11 20
1 2
思路:按照事件结束的时间从小到大排序,之后贪心
代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 10000
struct problem{
int Begin;//事件开始点
int End;//事件结束点
}p[MAX+5];//所支持的最多事件个数
int com(const void *a,const void *b)
{//快速排序,安装事件的结束时间从小到大排序
struct problem * aa = (struct problem*)a;
struct problem * bb = (struct problem*)b;
return (aa->End - bb->End);
}
void deal()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)//读取数据
scanf("%d%d",&p[i].Begin,&p[i].End);
qsort(p,n,sizeof(p[0]),com);
int count = 0;//计数
int starttime=0;//设置时间开始点,假设第一个事件从0时开始,0时结束
for(i = 0; i < n;i ++){
if(p[i].Begin>starttime){//若第i个事件的开始点大于前一事件的结束点,则该事件可选
count ++;
starttime = p[i].End;//跟新事件开始点为选定事件的结束点
}
}
printf("%d\n",count);
}
int main()
{
int N;
scanf("%d",&N);
while(N--){//N组测试数据
deal();
}
return 0;
}原文:http://blog.csdn.net/u012437355/article/details/41016087