113
技术社区[云栖]
NYOJ891-找点
找点
时间限制: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
来源
原创
思路:
贪心算法
1.先对区间按照右边界从小到大排序
2.每次取区间的左边界最大值和右边界最小值,如果两个区间刚好相邻,取他们的相交点作为左右边界,
只要每次新的区间的左边界不大于等于原来的右边界,取点总数都不用加1,否则加1
例如:
6
3 4
2 4
3 10
7 9
8 11
8 14
排序后是:
2 4
3 4
7 9
3 10
8 11
8 14
过程:sum=1;
首先,模板为[2,4],3,4加入, 比较左右点,更新为[3,4],此时依旧sum=1;
然后,模板为[3,4],7,9加入, 发现7>4, 此时更新左右边界为[7,9],sum+1=2;
然后,模板为[7,9],3,10加入,比较左右点,无需更新,此时依旧sum=2;
然后,模板为[7,9],8,11加入,比较左右点,更新为[8,9],此时依旧sum=2;
然后,模板为[8,9],8,14加入,比较左右点,不更新,此时sum依旧为2
最终答案便是2
图:
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct node { int x,y; }a[200]; int cmp(node a,node b) { if(a.y!=b.y) return a.y<b.y; } int main() { int i,j,n,m1,m2,sum,x; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d %d",&a[i].x,&a[i].y); sort(a,a+n,cmp); m1=a[0].x;m2=a[0].y;sum=1;x=0; //printf("m1=%d m2=%d\n",m1,m2); for(i=1;i<n;i++) { if(a[i].x<m2&&a[i].x>m1) m1=a[i].x; else { if(a[i].x==m2) { m1=a[i].x; m2=a[i].x; } if(a[i].x>m2) { sum++; m1=a[i].x; m2=a[i].y; } } //printf("m1=%d m2=%d\n",m1,m2); } printf("%d\n",sum); } return 0; }
最后更新:2017-04-03 12:56:36