[CodeForces-799B]

这题开始用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。写得有点长


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值