简单模拟题。
注意一点:如果一个人所有提交的代码都没编译通过,那么这个人不计排名。
如果一个人提交过的代码中有编译不通过的,也有通过的,那么那份编译不通过的记为0分。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std; const int maxn=10000+10; int n,k,m; int val[10]; struct X { int Rank; int num; int id; int tot; int get[10]; }s[maxn],ans[maxn]; int sz; bool cmp(const X&a,const X&b) { if(a.tot==b.tot&&a.num==b.num) return a.id<b.id; if(a.tot==b.tot) return a.num>b.num; return a.tot>b.tot; } int main() { scanf("%d%d%d",&n,&k,&m); for(int i=1;i<=k;i++) scanf("%d",&val[i]); for(int i=1;i<=n;i++) { s[i].id=i; s[i].num=0; s[i].tot=0; for(int j=1;j<=k;j++) s[i].get[j]=-2; } for(int i=1;i<=m;i++) { int id,pro,get; scanf("%d%d%d",&id,&pro,&get); s[id].get[pro]=max(s[id].get[pro],get); } sz=0; for(int i=1;i<=n;i++) { int fail=1; for(int j=1;j<=k;j++) if(s[i].get[j]>=0) fail=0; if(fail==1) continue; ans[sz++]=s[i]; } for(int i=0;i<sz;i++) for(int j=1;j<=k;j++) if(ans[i].get[j]==-1) ans[i].get[j]=0; for(int i=0;i<sz;i++) { for(int j=1;j<=k;j++) { if(ans[i].get[j]==-2) continue; ans[i].tot=ans[i].tot+ans[i].get[j]; if(ans[i].get[j]==val[j]) ans[i].num++; } } sort(ans,ans+sz,cmp); ans[0].Rank=1; for(int i=1;i<sz;i++) { if(ans[i].tot==ans[i-1].tot) ans[i].Rank=ans[i-1].Rank; else ans[i].Rank=i+1; } for(int i=0;i<sz;i++) { printf("%d %05d %d",ans[i].Rank,ans[i].id,ans[i].tot); for(int j=1;j<=k;j++) { printf(" "); if(ans[i].get[j]==-2) printf("-"); else printf("%d",ans[i].get[j]); } printf(" "); } return 0; }