问题 A: 移除木板
题目描述
创意班机房的地板要翻新啦,营长搬来了许多长短不一的木板。手痒的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] 的边界相互“接触”,但没有相互重叠。
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int st,en;
}f[10005];
bool cmp(node a,node b){
return a.en<b.en;
}
int main(){
int n;
while(cin>>n){
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
if(a<b){
f[i].st=a;
f[i].en=b;
}
else{
f[i].en=a;
f[i].st=b;
}
}
sort(f,f+n,cmp);
int sum=1,m=f[0].en;
for(int i=1;i<n;i++){
if(f[i].st>=m){
sum++;
m=f[i].en;
}
}
int ans=n-sum;
cout<<ans<<endl;
}
return 0;
}
一开始题目理解错了
后面看懂题目和题解,这题和hdoj上面的2037一样
还是太菜了。