题目链接:http://codevs.cn/problem/1214/
题面:
题目描述 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
数据范围及提示 Data Size & Hint
0<N<100
解题:
典型的贪心,即活动安排问题。每次先安排可以安排且结束最早的活动,留给后面更多的机会。
代码:
#include<iostream>
#include <algorithm>
using namespace std;
struct line
{
int l,r;
}store[105];
bool cmp(line a,line b)
{
return a.r<b.r;
}
int main()
{
int n,ans,p;
cin>>n;
ans=n;
for(int i=0;i<n;i++)
{
cin>>store[i].l>>store[i].r;
if(store[i].l>store[i].r)
swap(store[i].l,store[i].r);
}
sort(store,store+n,cmp);
p=store[0].r;
for(int i=1;i<n;i++)
{
if(store[i].l>=p)
p=store[i].r;
else
ans--;
}
cout<<ans<<endl;
return 0;
}