本文主要是介绍南工ACM:找点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
描述
上数学课时,老师给了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;
}
这篇关于南工ACM:找点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!