题目描述
创意班机房的地板要翻新啦,营长搬来了许多长短不一的木板。手痒的LZY趁大家不注意,把所有的木板叠在了一起,并且给大家提出了一个问题:我们最少需要移除多少块木板,使剩下的木板互相不重叠?作为ACMer的你,可以写个程序计算一下吗?
输入
测试样例由多组测试数据组成。每组测试数据第一行输入一个正整数n ( 1 <= n <= 10000 ),接下来 n行每行输入两个正整数,a,b ( 1 <= a , b <= 10000 )代表每块木板的起始坐标和最终坐标。
输出
输出每组测试样例最少需要移除的木板数量
输入样例
4
1 2
2 3
3 4
1 3
3
1 2
1 2
1 2
2
1 2
2 3
输出样例
1
2
0
提示
对于第一组样例,我们只需要移除区间为 1 3 的木板后,剩下的木板没有重叠
对于第二组样例,我们只需要移除2组 1 2 的木板后,剩下的木板没有重叠
对于第三组样例,我们不需要任何移除,他们本身没有重叠,注意:区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
思路
这是一道简单的贪心题,这题唯一的坑点就是题目没有说a不能大于b!!! 所以得swap进行转换
题目类似于杭电的hdu2037今年暑假不ac
代码
#include<bits/stdc++.h>
using namespace std;
struct aa{
int x,y;
}a[10010];
int cmp(aa a,aa b){
return a.y<b.y;
}
int main(){
long long n;
while(cin>>n){
for(int i=0;i<n;i++){
cin>>a[i].x>>a[i].y;
if(a[i].y<a[i].x){
swap(a[i].x,a[i].y);
}
}
sort(a,a+n,cmp);
int t=a[0].y;
int count=0;
for(int i=0;i<n;i++){
if(a[i].x>=t){
count++;
t=a[i].y;
}
}
cout<<n-count-1<<endl;
}
return 0;
}