Codeforces 799B -T-shirt buying(SET)

本文介绍了一个算法,用于解决顾客如何根据个人喜好颜色选择最便宜的T恤的问题。顾客按照顺序购买,每件T恤只能被购买一次。文章通过使用C++ STL set数据结构实现了高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

n 件T恤。第 i 件T恤的价格为 pi 。每个T恤有两面,第 i 件T恤正面颜色为 ai ,反面颜色为 bi

m 个人想买T恤,每个人都恰好买一件。第 j 个人最喜欢颜色 cj

一个人会选择买一件至少有一面颜色为他喜欢的颜色的,最便宜的T恤。如果没有合法的T恤,则不买。这些人按照给定的顺序来购买。

你的任务是求出每个人会花多少钱。

Input

第一行包含一个整数 n (1 ≤ n ≤ 200 000) — 表示T恤的数量。

之后一行为 p1, p2, ..., pn (1 ≤ pi ≤ 1 000 000 000), pi 表示第 i 件T恤的价格。

之后一行为 a1, a2, ..., an (1 ≤ ai ≤ 3), ai 表示第 i 件T恤正面的颜色。

之后一行为 b1, b2, ..., bn (1 ≤ bi ≤ 3), bi 表示第 i 件T恤背面的颜色。

之后一行包含一个整数 m (1 ≤ m ≤ 200 000) — 表示消费者人数。

之后一行为 c1, c2, ..., cm (1 ≤ cj ≤ 3), where cj表示第 j 个消费者最喜欢的颜色。这些消费者会按输入的顺序一个一个来购买。

Output

一行 m 个数 — 第 j 个数表示第 j-th buyer will buy. If the j 个消费者需要花的钱数。如果不购买,输出 -1

Example
Input
5
300 200 400 500 911
1 2 1 2 3
2 1 3 2 1
6
2 3 1 2 1 1
Output
200 400 300 500 911 -1 
Input
2
1000000000 1
1 1
1 2
2
2 1
Output
1 1000000000     

...STL set 用法 了解一下 https://www.cnblogs.com/SarahLiu/p/5892900.html   


代码如下:

#include <iostream>
#include <set>
using namespace std;
const int INF=0x3f3f3f3f;
struct stu
{
	int price;
	int aa;
	int bb;
}clo[200001];
//之前的方法 循环超时 利用 set 自动 选择最小 
int main()
{
	int n,m;
	set<int>s[4];
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>clo[i].price;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>clo[i].aa;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>clo[i].bb;
	}
	for(int i=1;i<=n;i++)
	{
		s[clo[i].aa].insert(clo[i].price);
		s[clo[i].bb].insert(clo[i].price);
	}
	cin>>m;
	int k;
	for(int j=1;j<=m;j++)
	{
		cin>>k;
		if(s[k].empty())
		{
			cout<<"-1"<<" ";
		}else
		{
			int ans=*(s[k].begin());
			cout<<ans<<" ";
			for(int i=1;i<=3;i++)//三种颜色
			{
				s[i].erase(ans);//清除掉已经买的衣服
			 } 
		}
		
	}
	return 0;
}         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值