题目描述
创意班机房的地板要翻新啦,营长搬来了许多长短不一的木板。手痒的LZY趁大家不注意,把所有的木板叠在了一起,并且给大家提出了一个问题:我们最少需要移除多少块木板,使剩下的木板互相不重叠?作为ACMer的你,可以写个程序计算一下吗?
输入
测试样例由多组测试数据组成。每组测试数据第一行输入一个正整数n ( 1 <= n <= 10000 ),接下来 n行每行输入两个正整数,a,b ( 1 <= a , b <= 10000 )代表每块木板的起始坐标和最终坐标。
输出
输出每组测试样例最少需要移除的木板数量
思路:
会场安排最多场次一样的问题。把结束时间进行递增排序,使得变成包含的小问题。
比赛的时候没有过,终极原因:(1 <= a , b <= 10000),没说a不能大于b呀!!!
审题很关键。。。
审题很关键。。。
审题很关键。。。
审题很关键。。。
审题很关键。。。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct ma{
int x,y;
}a[10005];
int cmp(ma x,ma y){
return x.y<y.y;
}
int b[10005],f,min1;
int main(){
while(cin>>n){
memset(b,0,sizeof b);
for(int i=0;i<n;i++){
scanf("%d %d",&a[i].x,&a[i].y);
if(a[i].x>a[i].y)swap(a[i].x,a[i].y);
}
sort(a,a+n,cmp);
f=1;
min1=a[0].y;
for(int i=1;i<n;i++){
if(a[i].x>=min1){
f++;
min1=a[i].y;
}
}
f=n-f;
cout<<f<<endl;
}
return 0;
}