题目描述 Description
给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分)。
输入描述 Input Description
输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表示一条线段的二个端点的坐标。
输出描述 Output Description
输出第一行是一个整数表示最多剩下的线段数。
样例输入 Sample Input
3
6 3
1 3
2 5
样例输出 Sample Output
2
贪心策略为从左到右,每次选取线段右端点坐标最小的线段。保留这条线段,并把和这条线段有公共部分的所有线段删除。证明:因为右端点坐标最小,可保证所有与这条线段没有公共部分的线段都在这条线段的右边,且所有与这条线段有公共部分的线段两两之间都有公共部分,而右端点坐标最小的线段对后面的线段影响最小。
ps:还是没懂为什么要以右短点为关键字来排序???
#include <iostream>
#include<algorithm>
#include <string>
using namespace std;
struct node
{
int a;
int b;
};
int cmp(const node &d1,const node &d2)
{
return d1.b<d2.b;
}
int main()
{
node d[200];
int n;
int ans;
cin>>n; //如果是while(cin>>n)也过不了,伤死人了
ans=0;
for (int i=0; i<n; i++)
{
cin>>d[i].a>>d[i].b;
if(d[i].a>d[i].b)
{
swap(d[i].a, d[i].b);
}
}
sort(d, d+n, cmp);
int Max=-1000;
for (int i=0; i<n; i++)
{
if(d[i].a>=Max)
{
ans++;
Max=d[i].b;
}
}
cout<<ans;
return 0;
}