传送门:题目
题意:
有n件T恤,告诉你每件T恤的价格,每件T恤的价格都不相同,和T恤正反面的颜色,颜色有且只有3种。
然后有m个顾客,每个顾客都有自己的基于颜色偏好值,有且只有1种,他们会购买自己喜欢的颜色且价格最便宜的。
依次输出第i名顾客购买T恤的价格。如果没有自己喜欢的颜色,输出-1
题解:
第一开始我没看到颜色有且只有三种,直接上了一个结构体,记录颜色和价格,然后直接
搜索,
,直接
果然超时了。然后发现只有三种颜色,就想了一下维护3个vector,后来又看到每件T恤的价格都不相同,发现,直接维护3个set就好了。漏看了两个条件,浪费了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;
}