第一部分:题目
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=891
描述
上数学课时,老师给了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
- 第二部分:思路
- 对区间进行从小到大排序,当左端点一样时把右端点从小到大排序。排序后从头开始找到当前第一个有待找点的区间a,把a的左端点置为-1,表示这一次找到的点在a区间上。后续区间b与a能找到公共点的情况:1,左端点一致,那么肯定有公共点。2,a、b的左端点不一致,但b左端点小于等于当前区间a的右端点。这里需要注意:如果b的右端点小于a的右端点时,需要把a的右端点置为b的右端点。并且把b的左端点置为-1.
- 第三部分:代码
#include<stdio.h> int main() { int n,s[100][2],i; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d%d",&s[i][0],&s[i][1]); } int j,t; for(i=0;i<n-1;i++)//从小到大排序 { for(j=i+1;j<n;j++) { if(s[i][0]>s[j][0]||s[i][0]==s[j][0]&&s[i][1]>s[j][1])//左端点一致时对右端点进行排序 { t=s[i][0]; s[i][0]=s[j][0]; s[j][0]=t; t=s[i][1]; s[i][1]=s[j][1]; s[j][1]=t; } } } int count=0; for(i=0;i<n;i++) { if(s[i][0]!=-1)//左端点为-1,已经找到一个点位于该区间 { int temp=s[i][1]; s[i][0]=-1;//找到点了 count++; for(j=i+1;j<n;j++) { if(s[j][0]!=-1&&s[j][0]<=temp) { s[j][0]=-1; if(temp>s[j][1])//注意,当后续区间在当前区间内部时,需要缩小范围 { temp=s[j][1]; } } } } } printf("%d ",count); } return 0; }