这题开始用sort做然后TLE了。这是我TLE的代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
const int maxn=200000+5;
int n,m,c[maxn],f,p,b;
struct shirt{
int f,b,p;
bool vis;
shirt(int ff,int bb,int pp,bool vv):f(ff),b(bb),p(pp),vis(vv){}
};
vector <shirt>v;
bool cmp(shirt a,shirt b){
return a.p<b.p;
}
void solve(){
sort(v.begin(),v.end(),cmp);
for(int i=0;i<m;i++)
for(int j=0;j<v.size();j++)
if((c[i]==v[j].f||c[i]==v[j].b)&&v[j].vis==false)
{/*cout<<"ci:"<<c[i]<<" ";*/printf("%d%c",v[j].p,i==m-1?'\n':' ');v[j].vis=true;break;}
else if(j==v.size()-1)
printf("-1\n");
}
int main(){
while(scanf("%d",&n)!=EOF){
v.clear();
for(int i=0;i<n;i++){
scanf("%d",&p);
v.push_back(shirt(0,0,p,false));
}
for(int i=0;i<n;i++){
scanf("%d",&f);
v[i].f=f;
//cout<<v[i].f<<" "<<v[i].p<<endl;
}
for(int i=0;i<n;i++){
scanf("%d",&b);
v[i].b=b;
}
/*for(int i=0;i<v.size();i++)
cout<<"v:"<<v[i].p<<" "<<v[i].f<<" "<<v[i].b<<" "<<endl;*/
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&c[i]);
solve();
}
return 0;
}
后来参考了别人的想法,用优先队列,看来以后如果sort会超时时就应该考虑用优先队列,因为是一个个放进去的时候就排好序的,所以时间复杂度比进行一次sort要低。
思路:定义三个优先队列分别对应颜色1 2 3,然后内部按价格从低到高排序。不过因为一件衣服有前后两种颜色,所以对于选了的衣服要进行标记。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<queue>
using namespace std;
const int maxn=200000+5;
int n,m,c[maxn],vis[maxn],f,p,b,id,judge;
struct shirt{
int f,b,p,id;
shirt(int ff,int bb,int pp,int ii):f(ff),b(bb),p(pp),id(ii){}
};
struct cmp{
bool operator ()(shirt a,shirt b){
return a.p>b.p;
}///比较函数结构体
};
priority_queue<shirt,vector<shirt>,cmp> q1,q2,q3;///优先队列
void solve(){
for(int i=0;i<m;i++){
judge=false;
if(c[i]==1){
while(!q1.empty()){
id=q1.top().id;
if(!vis[id]){
printf("%d%c",q1.top().p,i==m-1?'\n':' ');
vis[id]=true;
judge=true;
q1.pop();
break;
}
q1.pop();
}
}
else if(c[i]==2){
while(!q2.empty()){
id=q2.top().id;
if(!vis[id]){
printf("%d%c",q2.top().p,i==m-1?'\n':' ');
vis[id]=true;
judge=true;
q2.pop();
break;
}
q2.pop();
}
}
else if(c[i]==3){
while(!q3.empty()){
id=q3.top().id;
if(!vis[id]){
printf("%d%c",q3.top().p,i==m-1?'\n':' ');
vis[id]=true;
judge=true;
q3.pop();
break;
}
q3.pop();
}
}
if(!judge)
printf("-1%c",i==m-1?'\n':' ');
}
}
int main(){
while(scanf("%d",&n)!=EOF){
vector <shirt>v;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%d",&p);
v.push_back(shirt(0,0,p,i));
}
for(int i=0;i<n;i++){
scanf("%d",&f);
v[i].f=f;
}
for(int i=0;i<n;i++){
scanf("%d",&b);
v[i].b=b;
if(v[i].b==1||v[i].f==1)
q1.push(v[i]);
if(v[i].b==2||v[i].f==2)
q2.push(v[i]);
if(v[i].b==3||v[i].f==3)
q3.push(v[i]);
}
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&c[i]);
solve();
}
return 0;
}
开始看错了以为数组要开1e9,所以用了vector。写得有点长