题目链接: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]中与输出元素相同大小的元素删除,即可完成模拟买走这件衣服的过程(因每件衣服价格都不同,所以不会误删)。
1 #include<iostream> 2 #include<cstdio> 3 #include<set> 4 using namespace std; 5 const int N=2e5+5; 6 set<int>ms[5]; 7 struct node{ 8 int val,front,back; 9 }a[N]; 10 11 int main(){ 12 ios::sync_with_stdio(false); 13 int n; 14 cin>>n; 15 for(int i=1;i<=n;i++){ 16 cin>>a[i].val; 17 } 18 for(int i=1;i<=n;i++){ 19 cin>>a[i].front; 20 } 21 for(int i=1;i<=n;i++){ 22 cin>>a[i].back; 23 } 24 for(int i=1;i<=n;i++){ 25 ms[a[i].front].insert(a[i].val); 26 ms[a[i].back].insert(a[i].val); 27 } 28 int m; 29 cin>>m; 30 for(int i=1;i<=m;i++){ 31 int x; 32 cin>>x; 33 if(ms[x].size()==0) 34 cout<<"-1"<<endl; 35 else{ 36 int curval=*(ms[x].begin()); 37 cout<<curval<<" "; 38 for(int i=1;i<=3;i++){ 39 ms[i].erase(curval); 40 } 41 } 42 } 43 }