Codeforces 799B 暴力 set

传送门:题目

题意:

n件T恤,告诉你每件T恤的价格,每件T恤的价格都不相同,和T恤正反面的颜色,颜色有且只有3种
然后有m个顾客,每个顾客都有自己的基于颜色偏好值,有且只有1种,他们会购买自己喜欢的颜色且价格最便宜的。
依次输出第i名顾客购买T恤的价格。如果没有自己喜欢的颜色,输出-1

题解:

第一开始我没看到颜色有且只有三种,直接上了一个结构体,记录颜色和价格,然后直接 n 2 搜索, n [ 1 , 2 10 5 ] ,直接 n 2 果然超时了。然后发现只有三种颜色,就想了一下维护3vector,后来又看到每件T恤的价格都不相同,发现,直接维护3set就好了。漏看了两个条件,浪费了5分钟。
每种颜色用一个set保存,set里存放的值是价格,因为set自带sort,所以我们每次只要取第一个值就行了,然后循环找到另外一个set中对应该件T恤的价值,erase掉就好了。

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#define debug(x) cout<<#x<<" = "<<x<<endl;
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 200010;

set<int> st[4];
int pri[maxn];

int main(void) {
    int n, temp, m;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> pri[i];
    for (int i = 0; i < n; i++)
        cin >> temp, st[temp].insert(pri[i]);
    for (int i = 0; i < n; i++)
        cin >> temp, st[temp].insert(pri[i]);

    cin >> m;
    while (m--) {
        cin >> temp;
        if (st[temp].size() == 0) {
            cout << -1 << " ";
            continue;
        }
        temp = *(st[temp].begin());
        cout << temp << " ";
        for (int j = 1; j <= 3; j++)
            if ( st[j].find(temp)!= st[j].end())
                st[j].erase(st[j].find(temp));  
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shadandeajian/article/details/81806863
今日推荐