您的位置:首页 > 其它

nyoj891找点

2015-10-10 20:56 141 查看
贪心策略就是 把所有区间按b从小到大排序(当b相同时,排不排序都可以),则如果出现区间包含的情况,小区间一定排在前面。第一个区间取最后一个点。

/*
找点
时间限制:2000 ms  |  内存限制:65535 KB
难度:2
描述
上数学课时,老师给了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
*/
#include <stdio.h>
#include <stdlib.h>
struct Qu
{
int x;
int y;
}s[100];
int cmp(const void *a,const void *b)
{
Qu *c=(Qu *)a;
Qu *d=(Qu *)b;
if(c->y!=d->y)
return c->y-d->y;
else
return c->x-d->x;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i;
for(i=0;i<n;i++)
scanf("%d%d",&s[i].x,&s[i].y);
qsort(s,n,sizeof(s[0]),cmp);
int m,l=1;
m=s[0].y;//m作为其他与之比较的标记点,其代表着标记区间的右边界
for(i=1;i<n;i++)
{
if(s[i].x<=m)//下一个区间的左边界若是比标记区间的右边界小 则不需加点 不用改变标记点
continue;
else if(s[i].x>m)//下一个区间的左边界若是比标记区间的右边界大 则代表需添加标记点 此时改变标记点的位置
{
l=l+1;
m=s[i].y;
}
}
printf("%d\n",l);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: