Codeforces 799B

题目链接: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 }
原文地址:https://www.cnblogs.com/fu3638/p/6847254.html