找点
时间限制: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
此题为贪心区间取点问题,先将区间右端b按从小到大排序
当b相等时将a按从大到小排序,这样则小区间在大区间上边;
将第一个区间的右端b赋值给j,然后依次与以下区间的左端a比较
若大于以下区间的左端a,则证明有公共区间,当j大于后边的区间
左边a时,证明与以上区间无重合部分则 m++;左后输出m
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; struct record { int beg; int end; }num[101]; bool cmp(record a,record b) //排序 将区间右边按从小到大排序 { if(a.end!=b.end) return a.end<b.end; //区间左边 在右边的基础上从大到小排序 else return a.beg>b.beg; } int main() { int n,m,j,i,s,t; while(scanf("%d",&n)!=EOF) { j=0; for(i=0;i<n;i++) scanf("%d %d",&num[i].beg,&num[i].end); sort(num,num+n,cmp); j=num[0].end;m=1; for(i=1;i<n;i++) //当下一个区间的左边大于开始赋值的数 j { //则将此区间 的右边赋值给j if(num[i].beg>j) { j=num[i].end; m++; } } printf("%d ",m); } return 0; }