描述
上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?
输入多组测试数据。
每组数据先输入一个N,表示有N个闭区间(N≤100)。
接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。输出输出一个整数,表示最少需要找几个点。样例输入
4 1 5 2 4 1 4 2 3 3 1 2 3 4 5 6 1 2 2
样例输出
1 3 1
很简单的一道贪心算法题。
排序后找重合区域就可以了。 注意这组数据:
4
1 5
2 4
1 4
2 3
结果是1,
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int l;
int r;
}limits;
limits pot[101];
int comp ( const void *a, const void *b )
{
limits *c = (limits *) a;
limits *d = (limits *) b;
if(c->l != d->l)
return c->l - d->l;
else
return d->r - c->r;
}
void readp(int n)
{
int i;
for (i=0;i<n;i++)
{
scanf("%d%d",&pot[i].l,&pot[i].r);
}
}
void findp(int n)
{
int i;
int stand;
int ti=1;
qsort(pot,n,sizeof(limits),comp);
stand=pot[0].r;
for (i=1;i<n;i++)
{
if (pot[i].l>stand)
{
stand=pot[i].r;
ti++;
}
if (pot[i].l<=stand&&pot[i].r<=stand)
{
stand=pot[i].r;
}
}
printf("%d\n",ti);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
readp(n);
findp(n);
}
return 0;
}