Codeforces 799B T-shirt buying 题解

本文介绍了一种使用优先队列解决顾客购买特定颜色T恤问题的方法。通过维护三个优先队列来跟踪不同颜色的T恤及其价格,并利用一个布尔数组记录每件T恤是否已被购买,以此来为每位顾客寻找其最喜欢颜色的最低价T恤。

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

题意
有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值