CodeForces

题目链接

http://codeforces.com/problemset/problem/799/B

题意
给出N件衣服
pi 表示 第i件衣服的价格
ai 表示 第i件衣服的前面的颜色
bi 表示 第i件衣服的后面的颜色
然后有 m 位顾客
顾客会给出 他中意的颜色 只要 衣服的前面或者后面有这个颜色 那么 这件衣服 就是符合要求的 然后他要购买 目前还剩下的 最便宜的那件

先来先服务原则 并且 每件衣服 只有一件

思路

用 三个 vector 来保存 三个颜色的衣服 卖出 后 要标记一下

刚开始 T 了 因为我们每次都是从 头开始遍历的

后来想想 可以用三个 标记 分别标记 三个 vector 的头 这样 前面已经遍历过的 就可以不用 遍历 (还是 大佬提醒 才做出来)

刚开始 要给这三个 vector sort

对了 这个 价格 应该都是不同的 因为用 sort 都能过

大佬 给普及了一下 sort 的效率 最快是 nlogn 只有当 每个元素都不同时
最慢是 n^2 每个元素都相同时

插入排序是比较稳定的 nlogn

AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<set>
#include<list>
#include<vector>
#include<deque>
#include<stack>

#define ll long long

using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=2e5+10;

struct node
{
    int v, id;
}q[maxn];

vector <node> c[3];

int visit[maxn];

bool comp(node x, node y)
{
    return x.v < y.v;
}

int main()
{
    memset(visit, 0, sizeof(visit));
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &q[i].v);
        q[i].id = i;
    }
    int color;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &color);
        c[color - 1].push_back(q[i]);
    }
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &color);
        c[color - 1].push_back(q[i]);
    }
    sort(c[0].begin(), c[0].end(), comp);
    sort(c[1].begin(), c[1].end(), comp);
    sort(c[2].begin(), c[2].end(), comp);
    int m;
    scanf("%d", &m);
    int count[3] = {0};
    int flag[3] = {0};
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &color);
        if (i)
            printf(" ");
        int len = c[color - 1].size();
        if (count[color - 1] >= len)
        {
            printf("-1");
            continue;
        }
        int ans  = -1;
        for (int j = flag[color - 1]; j < len; j++)
        {
            if (visit[c[color - 1][j].id] == 0)
            {
                visit[c[color - 1][j].id] = 1;
                ans = c[color - 1][j].v;
                count[color - 1]++;
                flag[color - 1] = j + 1;
                break;
            }
        }
        printf("%d", ans);
    }
    printf("
");
}
原文地址:https://www.cnblogs.com/Dup4/p/9433119.html