1075 PAT Judge (25 分)难度: 一般 / 知识点: 多关键字排序

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1075 PAT Judge (25 分)难度: 一般 / 知识点: 多关键字排序相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805393241260032
就是排序,注意一些细节即可。

#include<bits/stdc++.h>
using namespace std;
struct node 
{
    string name;
    int s[10],cnt;
    int sum=0;
}temp;
unordered_map<string,node>mp;
unordered_map<string,int>hush;
vector<node>ve;
int a[10],n,k,m;
bool cmp(node a,node b)
{
    if(a.sum==b.sum)
    {
        if(a.cnt==b.cnt)
               return a.name<b.name;
        return a.cnt>b.cnt;
    }
    return a.sum>b.sum;
}
int main(void)
{
    scanf("%d%d%d",&n,&k,&m);
    for(int i=0;i<k;i++) scanf("%d",&a[i]);
    for(int i=0;i<m;i++)
    {
        string name;
        int id,score;
        cin>>name;
        scanf("%d%d",&id,&score);
        if(!hush[name])//这个学号没见过
        {
            for(int j=0;j<k;j++) mp[name].s[j]=-2;//先将每门置为-2,意为还没提交过
            mp[name].s[id-1]=score;
            hush[name]=1;
        }else mp[name].s[id-1]=max({score,mp[name].s[id-1]});
    }
    for(auto i=mp.begin();i!=mp.end();i++)
    {
        temp.name=i->first;
        int cnt=0;
        temp.sum=0;
        bool flag=0;
        for(int i=0;i<k;i++)
        {
            temp.s[i]=mp[temp.name].s[i];
            if(temp.s[i]==a[i]) cnt++;
            if(temp.s[i]>=0) temp.sum+=temp.s[i],flag=1;//说明有提交过题
        }
        temp.cnt=cnt;
        if(flag) ve.push_back(temp);
    }
    sort(ve.begin(),ve.end(),cmp);
    int index=1;
    for(int i=0;i<ve.size();i++) 
    {
        printf("%d",index);
        printf(" %s %d",ve[i].name.c_str(),ve[i].sum);
        for(int j=0;j<k;j++) 
        {
            if(ve[i].s[j]==-2) printf(" -");
            else if(ve[i].s[j]==-1) printf(" 0");
            else printf(" %d",ve[i].s[j]);
        }
        puts("");
        if(i+1!=ve.size()&&ve[i].sum!=ve[i+1].sum) index=i+2;
    }
    return 0;
}

以上是关于1075 PAT Judge (25 分)难度: 一般 / 知识点: 多关键字排序的主要内容,如果未能解决你的问题,请参考以下文章