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("
    ");
    }
  • 相关阅读:
    c++函数模板
    C++左移运算符重载
    and or bool and a or b 原理解释
    Python的垃圾回收机制
    《C++ 101条建议》学习笔记——第一章快速入门
    在应用中嵌入Python:转
    使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments
    python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html
    python文件头的#-*- coding: utf-8 -*- 的作用
    Pythhon 字典 key in dict 比 dict.has_key (key)效率高 为什么?
  • 原文地址:https://www.cnblogs.com/Dup4/p/9433119.html
Copyright © 2011-2022 走看看