描述
上数学课时,老师给了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
思路:
1. 求最多/最少 类似的问题,考虑 贪心算法,或者 动态规划。
2. 贪心算法 的解题思路 时常伴随着排序,特别是当一个元素有两个或者以上的属性时。
3. 像这种属性表示 范围 情况下, 一般是对(a , b)中b进行排序。
4. 有排序的贪心算法,复杂度一般不大,可能接近线性。
先对元素node[i]按照b从小到大进行排序
num=1;
m=a1,n=b1 //以后ai表示node[i].a , bi表示node[i].b
第i个区域与前的区域可能的关系有
#include<stdio.h>
struct data{
int a;//左闭区间
int b;//右闭区间
};
void kuaipai(struct data* node,int l,int r);
int main()
{
int m=0,n=0;
int i=0;
struct data node[100+1];
int num=1;
int N=0;
while(scanf("%d",&N)!=EOF)
{
for(i=1;i<=N;i++)
{
scanf("%d%d",&node[i].a,&node[i].b);
}
kuaipai(node,1,N);//按照b从小到大排序
num=1;
m=node[1].a;
n=node[1].b;
for(i=2;i<=N;i++)
{
if(node[i].a<=m)
continue;
if(node[i].a>m && node[i].a<=n)
{
m=node[i].a;
continue;
}
if(node[i].a > n)
{
num++;
m=node[i].a;
n=node[i].b;
}
}
printf("%d\n",num);
}
return 0;
}
void kuaipai(struct data* node,int l,int r)
{
int i=l,j=l;
int x=0,y=0;
int k=node[r].b;
if(l>=r)
return;
for(i=l;i<=r-1;i++)
{
if(node[i].b<k)
{
x=node[i].a;
y=node[i].b;
node[i].a=node[j].a;
node[i].b=node[j].b;
node[j].a=x;
node[j].b=y;
j++;
}
}
x=node[r].a;
y=node[r].b;
node[r].a=node[j].a;
node[r].b=node[j].b;
node[j].a=x;
node[j].b=y;
kuaipai(node,l,j-1);
kuaipai(node,j+1,r);
return;
}

919

被折叠的 条评论
为什么被折叠?



