区间相交问题
原题 FZU - 1230 链接 http://acm.fzu.edu.cn/problem.php?pid=1230
给定 x 轴上 n 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。
★算法设计: 对于给定的 n 个闭区间,计算去掉的最少闭区间数。
Input
对于每组输入数据,输入数据的第一行是正整数 n (1<=n<=40,000),表示闭区间数。接下来的 n 行中,每行有 2 个整数,分别表示闭区间的 2 个端点。
Output
输出计算出的去掉的最少闭区间数。
Sample Input
3 10 20 15 10 20 15
Sample Output
2
贪心题,按照区间从小到大排序,去除大区间,尽量保留小区间,记录保留下来的区间数量num,总数减去num即可得解,注意,题目给出的区间不一定是按照从小到大排,例如区间【15,10】和区间【10 , 20】,所以要将二者调换。
以下是AC代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int x1;
int x2;
};
bool cmp(node n,node m)
{
if(n.x2!=m.x2)
return n.x2<m.x2;
else return n.x1>m.x1;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
node mapp[50010];
int a,b;
for(int i=0; i<n; i++)
{
scanf("%d%d",&a,&b);
if(a<b)
{
mapp[i].x1=a;
mapp[i].x2=b;
}
else
{
mapp[i].x1=b;
mapp[i].x2=a;
}
}
sort(mapp,mapp+n,cmp);
int k=mapp[0].x2,num=1;
for(int i=1; i<n; i++)
{
if(mapp[i].x1>k)
{
sum++;
k=mapp[i].x2;
}
}
printf("%d\n",n-num);
}
return 0;
}