Solution:
题目要求:模拟pat judge系统。给出n个用户,k个问题,m个提交数。对用户的总得分进行等级排名。每道题都有自己的分数。但用户总得分相同时,谁做的满分题目多谁排名靠前,若用户满分题目数仍相同,则按用户id排名。没有提交过一道题的用户以及提交过但没有一道题通过编译的用户不参加排名。
代码如下:
//模拟+排序
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#define INF 0x3f3f3f3f
using namespace std;
struct student{
int id;//编号
int grade[10];//各道题的成绩
int total_grade;
int perfect;
student(){
total_grade=0;
perfect=0;
for(int i=0;i<10;i++){
grade[i]=-1;
}
}
}stu[10005];
int n,k,m;//n为学生数,k为题目数,m为提交数
int problem[10];//记录每道题的满分
bool flag[10005];
vector<student> vec;
bool cmp(student a,student b){
if(a.total_grade>b.total_grade){
return true;
}else if(a.total_grade==b.total_grade){
if(a.perfect>b.perfect){
return true;
}else if(a.perfect==b.perfect){
return a.id<b.id;
}
}
return false;
}
int main(){
cin>>n>>k>>m;
for(int i=1;i<=k;i++){
cin>>problem[i];
}
int id,pro_id,grade;//学生id,题目id,分数
for(int i=0;i<m;i++){
cin>>id>>pro_id>>grade;
stu[id].id=id;
if(grade==problem[pro_id]&&stu[id].grade[pro_id]!=problem[pro_id]){
//反复提交满分题目只计算一次
stu[id].perfect++;
}
if(grade>=stu[id].grade[pro_id]){
if(grade==-1){
stu[id].grade[pro_id]=0;
}else{
stu[id].grade[pro_id]=grade;
}
}
if(grade!=-1){
flag[id]=true;
}
}
for(int i=1;i<=n;i++){
if(flag[i]){
student temp;
temp.id=i;
temp.perfect=stu[i].perfect;
for(int j=1;j<=k;j++){
if(stu[i].grade[j]!=-1){
temp.total_grade+=stu[i].grade[j];
}
temp.grade[j]=stu[i].grade[j];
}
vec.push_back(temp);
}
}
sort(vec.begin(),vec.end(),cmp);
int recent=INF;//记录最近的分数
int now_rank=0;
int ans=1;
for(int i=0;i<vec.size();i++){
if(vec[i].total_grade<recent){
now_rank++;
recent=vec[i].total_grade;
if(now_rank<ans){
now_rank=ans;
}
}
printf("%d %05d %d",now_rank,vec[i].id,vec[i].total_grade);
for(int j=1;j<=k;j++){
if(vec[i].grade[j]==-1){
printf(" -");
}else{
printf(" %d",vec[i].grade[j]);
}
}
printf("\n");
ans++;
}
return 0;
}