1214 线段覆盖
题目描述 Description给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分)。
输入描述 Input Description输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表示一条线段的二个端点的坐标。
输出描述 Output Description输出第一行是一个整数表示最多剩下的线段数。
样例输入 Sample Input3
6 3
1 3
2 5
样例输出 Sample Output2
数据范围及提示 Data Size & Hint0<N<100
贪心!将所有线段按终点从小到大排序,再依次判断是否可以加入。
附AC代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 struct node{//前后端点 6 int a,b; 7 }n[105]; 8 9 int cmp(node x,node y){ 10 return x.b<y.b; 11 } 12 13 int main(){ 14 int t; 15 cin>>t; 16 for(int i=0;i<t;i++){ 17 cin>>n[i].a>>n[i].b; 18 if(n[i].a>n[i].b)//将较小的点放在前面 19 swap(n[i].a,n[i].b); 20 } 21 sort(n,n+t,cmp);//排序 22 int ans=0; 23 int max=-1000; 24 for(int i=0;i<t;i++){ 25 if(n[i].a>=max){ 26 max=n[i].b; 27 ans++; 28 } 29 } 30 cout<<ans<<endl; 31 return 0; 32 }