题意
有n件T恤,正面与背面印有颜色,有m个顾客依次来买,每人有一种喜欢的颜色,他会买正面或背面有这种颜色的最便宜的衣服,如果没有就不买,问每人花的钱数
思路
建3个优先队列和一个used数组,队列中分别是带有这3种颜色的衣服价钱和编号,数组表示这个衣服是否已经被买走,对每一个人,在优先队列里找到他喜欢的颜色里没被买走的第一件,这个价格就是他要花的钱,如果直到队列为空都没有,那就不买
代码
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q[4];
bool used[200001];
int p[200001],a[200001],b[200001];
int main()
{
int n,m,c,pp;
pair<int,int> t;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
q[a[i]].push(make_pair(p[i],i));
q[b[i]].push(make_pair(p[i],i));
}
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&c);
pp=-1;
while(!q[c].empty())
{
t=q[c].top();
q[c].pop();
if(used[t.second])
continue;
else
{
pp=t.first;
used[t.second]=true;
break;
}
}
printf("%d ",pp);
}
printf("\n");
return 0;
}