1. 程式人生 > >PAT (Advanced Level) Practice 1075 PAT Judge (25 分)

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

要求:
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; }