有 n 件T恤。第 i 件T恤的价格为 pi 。每个T恤有两面,第 i 件T恤正面颜色为 ai ,反面颜色为 bi 。
有 m 个人想买T恤,每个人都恰好买一件。第 j 个人最喜欢颜色 cj。
一个人会选择买一件至少有一面颜色为他喜欢的颜色的,最便宜的T恤。如果没有合法的T恤,则不买。这些人按照给定的顺序来购买。
你的任务是求出每个人会花多少钱。
第一行包含一个整数 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 个消费者最喜欢的颜色。这些消费者会按输入的顺序一个一个来购买。
一行 m 个数 — 第 j 个数表示第 j-th buyer will buy. If the j 个消费者需要花的钱数。如果不购买,输出 -1。
5 300 200 400 500 911 1 2 1 2 3 2 1 3 2 1 6 2 3 1 2 1 1
200 400 300 500 911 -1
2 1000000000 1 1 1 1 2 2 2 1
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;
}