为m位顾客挑选n件带有两种颜色的衣服,问每个顾客的花费。
直接从顾客入手,复杂度是m*n,当n和m越大的时候,会超时。所以从三种颜色入手,用set存储三种颜色衣服的代价,若这种颜色衣服没有了,那喜欢这种颜色的顾客就买不到衣服,即输出-1。当满足时,这个价格的颜色都会相应删除。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+5;
set<int>color[5];
struct shirt{
ll p;
int front;
int back;
};
shirt s[N];
int main(){
int n,m,buy;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%lld",&s[i].p);
for(int i=0;i<n;i++)
scanf("%d",&s[i].front);
for(int i=0;i<n;i++)
scanf("%d",&s[i].back);
for(int i=0;i<n;i++){
color[s[i].front].insert(s[i].p);
color[s[i].back].insert(s[i].p);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&buy);
if(color[buy].size()==0)
printf("-1\n");
else{
int tmp=*(color[buy].begin());
printf("%d ",tmp);
for(int i=1;i<=3;i++)
color[i].erase(tmp);
}
}
}
return 0;
}