PAT (Advanced Level) Practice 1075 PAT Judge (25 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84346415

要求:
1.总分相同的排名相同
2.总分高的排前
3.A题数多的排前
4.id字典序小的排前
5.题目未通过编译或未提交的人不计

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
using namespace std;

const int N=1e5+5;

struct People
{
    int score[6],sum,perf;
    char id[10];
    People(){for(int i=0;i<6;i++) score[i]=-2;}
    bool operator<(const People&p)const
    {
        if(sum!=p.sum) return sum>p.sum;
        if(perf!=p.perf) return perf>p.perf;
        return strcmp(id,p.id)<0;
    }
}pe[N],newpe[N];

int p[10];
map<string,int> mp;

int main()
{
    int n,k,m;
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<=k;i++)
        scanf("%d",p+i);
    int res=0;
    while(m--)
    {
        int pid,psc;
        char uid[10];
        scanf("%s",uid);
        if(!mp.count(uid))
        {
            mp[uid]=++res;
            strcpy(pe[mp[uid]].id,uid);
        }
        scanf("%d%d",&pid,&psc);
        if(pe[mp[uid]].score[pid]<psc) pe[mp[uid]].score[pid]=psc;
    }
    int cnt=0;
    for(int i=1;i<=res;i++)
    {
        int sum=0,perf=0,f=0;
        for(int j=1;j<=k;j++)
            if(pe[i].score[j]>=0)
            {
                f=1;
                sum+=pe[i].score[j];
                if(pe[i].score[j]==p[j])
                    perf++;
            }
        if(f)
        {
            newpe[cnt]=pe[i];
            newpe[cnt].sum=sum;
            newpe[cnt].perf=perf;
            cnt++;
        }
    }
    sort(newpe,newpe+cnt);
    int rk=0;
    for(int i=0;i<cnt;i++)
    {
        if(i==0||newpe[i].sum!=newpe[i-1].sum) rk=i+1;
        printf("%d %s %d",rk,newpe[i].id,newpe[i].sum);
        for(int j=1;j<=k;j++)
        {
            if(newpe[i].score[j]==-2) printf(" -");
            else printf(" %d",max(0,newpe[i].score[j]));
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/84346415