abc E - Wrapping Chocolate

5 篇文章 0 订阅

题目传送门:E - Wrapping Chocolate
题目大意: 有n块给出长和宽的巧克力和m个给出长和宽的盒子,要求能把巧克力都装进盒子里。
思路:长和宽二维合起来考虑的话将会非常困难,所以应将盒子和巧克力的数组合起来对一个元素作为主键排序,然后从最大开始,每次遇到盒子的数组就把非主键元素放入集合,遇到巧克力数组就以其非主键元素在集合内查找,找到最小的且不小于当前元素的值并删除,找不到就代表没有符合条件的盒子。
代码:

#include<iostream>
#include<set>
#include<algorithm> 
using namespace std;
int n,m;
struct node{
	int l,r,v;
	bool operator<(const node &a)const{
		return l<a.l||(l==a.l&&r<a.r)||(l==a.l&&r==a.r&&v>a.v);
	}
}a[810010];
multiset<int> box;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i].l;
	for(int i=1;i<=n;i++)cin>>a[i].r;
	for(int i=1;i<=n;i++)a[i].v=1;
	for(int i=n+1;i<=n+m;i++)cin>>a[i].l;
	for(int i=n+1;i<=n+m;i++)cin>>a[i].r;
	sort(a+1,a+1+n+m);
	int s1 = 0,s2 = 0;
	for(int i=n+m;i>=1;i--){
		if(a[i].v==0){
			box.insert(a[i].r);
		}
		else{
			auto it=box.lower_bound(a[i].r);
			if(it==box.end()){
				cout<<"No"<<endl;
				return 0;
			}
			box.erase(it);
		}
	}
	cout<<"Yes"<<endl;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

某六十九岁合法萝莉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值