题目描述:
有一个整数n表示有n种衬衫(每种衬衫只有一件),然后输入这n件衬衫的价格,然后依次输入每一件衬衫前面的颜色,再依次输入每一件衬衫后面的颜色(所有的颜色都是用1,2,3表示的),然后输入m表示有m个人,然后输入这m个人喜欢的颜色,每个人买一件衣服,一个人要买这件衣服,必须前后两面至少有一面是他喜欢的颜色,如果同时有多件选择最低价格那一件,当然,选完这件之后其他人就不能再选这件了,如果没有符合条件的就输出-1,否则输出这件衬衫的价格;
输入:
5 300 200 400 500 911 1 2 1 2 3 2 1 3 2 1 6 2 3 1 2 1 1输出:
200 400 300 500 911 -1
一看就很容易超时,然后怎么做呢,最好选择set吧,我个人感觉它应该比较快,好像是堆排序对吧,然后必须要开一个数组标记是否用过,set里插入的话因为价值是不同的,所以要插入价值和标号,插入的set要有三个分别为颜色代表,然后表输出边删除;
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000+10;
set< pair<int,int> >s[4];
int p[maxn],a[maxn],b[maxn],vis[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&p[i]);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) scanf("%d",&b[i]);
for(int i=0;i<n;i++)
{
s[a[i]].insert(make_pair(p[i],i));
s[b[i]].insert(make_pair(p[i],i));
}
int m;
scanf("%d",&m);
int c;
for(int i=0;i<m;i++)
{
int ans=-1;
scanf("%d",&c);
if(i!=0) printf(" ");
while(!s[c].empty())
{
int x=(*(s[c].begin())).second;
s[c].erase(s[c].begin());
if(vis[x]) continue;
vis[x]=1;
ans=p[x];
break;
}
printf("%d",ans);
}
return 0;
}