题目:yyy要参加比赛,且一次只能参加一场比赛,问最多可以参加多少场?
输入:第一行n代表n场赛事,后面n行给出比赛的起止时间
输出:一个数,最多参加比赛的场数。
转换:在一个数轴上有n条线段,要从中取出不相交的k条,问k的最大值为多少?
思路:右端点越小,占的空间就越少,留给其他线段的空间就越多。
将线段按右端点进行排序,能放就放。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define N 1000005
typedef struct
{
int left;
int right;
}Com;
Com vs[N];
int cmp(const void*a, const void*b)
{
Com k1 = *(Com*) a;
Com k2 = *(Com*) b;
return k1.right - k2.right;
}
int main(void)
{
int n,cnt=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d %d",&vs[i].left,&vs[i].right);
}
qsort(vs,n,sizeof(Com),cmp);
int p=0;
for(int i=0; i<n; i++)
{
if(vs[i].left >= p)
{
cnt++; p = vs[i].right;
}
}
printf("%d",cnt);
}