[ABC245E] Wrapping Chocolate 题解

这题我们可以用多重集合的贪心,我们不管它是盒子还是巧克力全部一起存入一个结构体当中再排序。我们先按 x x x 由大到小进行排序,如果相等则按 y y y 由大到小进行排序。要是 x x x y y y 都是相等的,我们就先将盒子排在前面。

排完序后,我们从 1 1 1 开始遍历到 n + m n+m n+m,我们可以利用 multiset 进行查找。如果是巧克力的话,用 lower_bound() 即可,lower_bound() 可以找出第一个也就是大小最相近的 y y y 大于等于该巧克力 y y y 的盒子。如果没找到则输出 No,并结束程序。这是因为:没有找到符合要求的盒子来装巧克力,那么接下来的盒子的 x x x 都比该巧克力的 x x x 小,所以是不符合题意的。

否则将第一个也就是大小最相近的 y y y 大于等于该巧克力 y y y 的盒子踢出集合。如果是盒子的话,就把当前盒子放入集合中。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct op{
	int x,y;//分别表示两条边的长度 
	bool pd;//判断是否为巧克力 
}a[1000005];
int n,m;
bool cmp(op a,op b)//比较函数 
{
	return (a.x==b.x?(a.y==a.y?a.pd<b.pd:a.y>b.y):a.x>b.x);//排序方法,见上 
}
multiset<int> q;
signed main()
{
	cin>>n>>m;
	for(register int i=1;i<=n;i++)
	{
		cin>>a[i].x;
		a[i].pd=true;//标记为巧克力 
	}
	for(register int i=1;i<=n;i++)
	{
		cin>>a[i].y;
	}
	for(register int i=n+1,j=1;j<=m;j++,i++)//注意是从n+1开始的,否则会重复 
	{
		cin>>a[i].x;
		a[i].pd=false;//标记为盒子 
	}
	for(register int i=n+1,j=1;j<=m;j++,i++)
	{
		cin>>a[i].y;
	}
	sort(a+1,a+n+m+1,cmp);
	for(register int i=1;i<=n+m;i++)
    {
    	if(a[i].pd==true)//巧克力 
    	{
    		auto now=q.lower_bound(a[i].y);//查询 
        	if(now==q.end())//没有 
			{
        		cout<<"No";
        		return 0;
			}
			q.erase(now);//删除 
		}
		else
		{
			q.insert(a[i].y);//插入 
		}
    }
    cout<<"Yes";
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值