问题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] 的边界相互“接触”,但没有相互重叠。

思路

这是一道简单的贪心题,这题唯一的坑点就是题目没有说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;
}

swap杀我呜呜呜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值