题目链接:http://codeforces.com/problemset/problem/799/B
题目大意:有n件T恤,每件T体恤都分别有价格(每件衣服的价格不重复)、前面的颜色、背部的颜色三种属性。接下来有m个人每个人都有一种喜欢的颜色,他们按先后顺序选择衣服,如果没有喜欢的颜色的衣服了就输出“-1”,否则选择其中符合条件的衣服中价值最小的。输出每个人要付出的钱。
解题思路:使用c++STL里的set(会自动按照从小到大的顺序排好,不存在重复),设置set[1],set[2],set[3]分别对应三种颜色。我们只要按颜色分别将价值存入set里,当要买指定颜色x的衣服是,只用输出set[x]里的第一个元素(即所需的最小价值),再把set[1]~set[3]中与输出元素相同大小的元素删除,即可完成模拟买走这件衣服的过程(因每件衣服价格都不同,所以不会误删)。
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
const int N=2e5+;
set<int>ms[];
struct node{
int val,front,back;
}a[N]; int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i].val;
}
for(int i=;i<=n;i++){
cin>>a[i].front;
}
for(int i=;i<=n;i++){
cin>>a[i].back;
}
for(int i=;i<=n;i++){
ms[a[i].front].insert(a[i].val);
ms[a[i].back].insert(a[i].val);
}
int m;
cin>>m;
for(int i=;i<=m;i++){
int x;
cin>>x;
if(ms[x].size()==)
cout<<"-1"<<endl;
else{
int curval=*(ms[x].begin());
cout<<curval<<" ";
for(int i=;i<=;i++){
ms[i].erase(curval);
}
}
}
}