数轴上有n个闭区间[ai, bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。
输入格式:
第一行一个数字n,表示有n个闭区间。 下面n行,每行包含2个数字,表示闭区间[ai, bi]
输出格式:
一个整数,表示至少需要几个点
输入样例:
在这里给出一组输入。例如:
3 1 3 2 4 5 6
输出样例:
在这里给出相应的输出。例如:
2
代码:
#include <iostream> #include<algorithm> using namespace std; typedef struct { int start; int end; bool x=0; //x=0表示未处理 }section; bool complare(const section &a,const section &b){ //自己定义sort排序规则,按start从小到大排序 return a.start<b.start; } int main(){ //输入 int n; //表示有n个闭区间 cin>>n; section a[n+1]; //从1开始 int count = 0; for(int i=1;i<=n;i++){ cin>>a[i].start>>a[i].end; } //排序 sort(a+1,a+1+n,complare); //处理 for(int i=1;i<=n;i++) { if( a[i].x == 1 ) continue; int front = a[i].start; int back = a[i].end; for(int j=i+1;j<=n;j++) //以第i个区间为基准,找后面的区间有多少个与a[i],若重叠,标记该区间,再取重叠部分继续往下找 { if( a[j].x == 1 ) continue; if( a[j].start <= back ) // 头在区级 a【i】里面 { front = a[j].start;
if(a[j].end<=back) back = a[j].end; //尾部也在区间 a[i] 里面 a[j].x = 1; // 已处理过,做标记1 } } count ++; a[i].x = 1; // 可以去掉 } cout<<count<<endl; return 0; }