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("
    ");
    }
  • 相关阅读:
    main函数的一些特性
    确保函数的操作不超出数组实参的边界
    今天学习了一点sed
    libevent 与事件驱动
    mvc3 action验证失败后的自定义处理
    使用spring.net+nibernate时如何用aspnet_regiis加密数据库连接字符串
    C# 中 IList IEnumable 转换成 List类型
    Nhibernate 过长的字符串报错 dehydration property
    小论接口(interface)和抽象类(abstract class)的区别
    C# 语言在函数参数列表中出现this关键词的作用
  • 原文地址:https://www.cnblogs.com/Dup4/p/9433119.html
Copyright © 2011-2022 走看看