1. 程式人生 > 實用技巧 >P2120 [ZJOI2007]倉庫建設

P2120 [ZJOI2007]倉庫建設

毒瘤題。。。之後找機會重寫下吧。。。畢竟現在的碼風慘不忍睹,而且\(\color{green}{AcWing}\)上只過了\(3\)個點=_=

注意分數相同的同學名次相同,並且小於當前分數的同學的名次依次向後遞進。

例如:1、1、3、4、5,而不是1、1、2、3、4。

const int N=2010;
struct Stu {
    int c_rank,m_rank,e_rank,avg_rank;
}a[N];
PII c[N],m[N],e[N];
unordered_map<string,int> mp;
PDI avg[N];
int n,q;


int main()
{
    cin>>n>>q;

    for(int i=0;i<n;i++)
    {
        string id;
        cin>>id>>c[i].fi>>m[i].fi>>e[i].fi;
        avg[i].fi=(c[i].fi+m[i].fi+e[i].fi)/3.0;
        mp[id]=i;
        c[i].se=m[i].se=e[i].se=avg[i].se=i;
    }

    sort(c,c+n,greater<PII>());
    sort(m,m+n,greater<PII>());
    sort(e,e+n,greater<PII>());
    sort(avg,avg+n,greater<PDI>());

    int tot=1;
    for(int i=0;i<n;i++)
    {
        if(i && c[i].fi == c[i-1].fi)
            a[c[i].se].c_rank=a[c[i-1].se].c_rank;
        else
            a[c[i].se].c_rank=tot;
        tot++;
    }
    tot=1;
    for(int i=0;i<n;i++)
    {
        if(i && m[i].fi == m[i-1].fi)
            a[m[i].se].m_rank=a[m[i-1].se].m_rank;
        else
            a[m[i].se].m_rank=tot;
        tot++;
    }
    tot=1;
    for(int i=0;i<n;i++)
    {
        if(i && e[i].fi == e[i-1].fi)
            a[e[i].se].e_rank=a[e[i-1].se].e_rank;
        else
            a[e[i].se].e_rank=tot;
        tot++;
    }
    tot=1;
    for(int i=0;i<n;i++)
    {
        if(i && avg[i].fi == avg[i-1].fi)
            a[avg[i].se].avg_rank=a[avg[i-1].se].avg_rank;
        else
            a[avg[i].se].avg_rank=tot;
        tot++;
    }

    while(q--)
    {
        string id;
        cin>>id;
        if(!mp.count(id))
        {
            puts("N/A");
            continue;
        }
        int x=mp[id];

        int rank=min(min(a[x].c_rank,a[x].m_rank),min(a[x].e_rank,a[x].avg_rank));

        if(a[x].avg_rank == rank)
            cout<<rank<<' '<<'A'<<endl;
        else if(a[x].c_rank == rank)
            cout<<rank<<' '<<'C'<<endl;
        else if(a[x].m_rank == rank)
            cout<<rank<<' '<<'M'<<endl;
        else
            cout<<rank<<' '<<'E'<<endl;
    }


    //system("pause");
    return 0;
}