zoukankan      html  css  js  c++  java
  • 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("
    ");
    }
  • 相关阅读:
    前端解决跨域问题的8种方案(最新最全)
    javascript中“use strict”的好处和坏处
    转载 :请描述一下 cookies,sessionStorage 和 localStorage 的区别?
    七天学会nodejs
    js中的类、继承、闭包
    转:浏览器内核、渲染引擎、js引擎
    html中position定位问题
    html浏览器的兼容问题
    css命名规则
    搭建keepalived遇到的问题
  • 原文地址:https://www.cnblogs.com/Dup4/p/9433119.html
Copyright © 2011-2022 走看看