如果成绩是-1,输出的时候要输出0而不是-1。(在他能被输出的时候)如果没提交过输出-。
要注意一下,考题的编号是从1开始的,所以数组要开够,要注意下标的取值。
#include <bits/stdc++.h>
using namespace std;
struct Node{
int id,total=0,cnt=0,rk;
int grade[6];
bool friend operator <(Node a,Node b){
if(a.total!=b.total)return a.total>b.total;
else if(a.cnt!=b.cnt)return a.cnt>b.cnt;
else return a.id<b.id;
}
};
int main(){
int user,num,item;
int score[6];
cin>>user>>num>>item;
for(int i=1;i<=num;i++){
cin>>score[i];
}
vector<Node> vec(user+1);
for(int i=0;i<=user;i++){
fill(vec[i].grade,vec[i].grade+6,-2);
}
for(int i=0;i<item;i++){
int id,t,grd;
cin>>id>>t>>grd;
vec[id].id=id;
if(grd>vec[id].grade[t])vec[id].grade[t]=grd;
}
vector<Node> res;
for(int i=1;i<=user;i++){
bool flag=true;
for(int j=1;j<=num;j++){
if(vec[i].grade[j]>=0){
flag=false;
vec[i].total+=vec[i].grade[j];
if(vec[i].grade[j]==score[j])vec[i].cnt++;
}
}
if(!flag)res.push_back(vec[i]);
//else printf("%09d\n",vec[i].id);
}
sort(res.begin(),res.end());
for(int i=0;i<res.size();i++){
if(i==0)res[i].rk=1;
else if(res[i].total==res[i-1].total)res[i].rk=res[i-1].rk;
else res[i].rk=i+1;
printf("%d %05d %d",res[i].rk,res[i].id,res[i].total);
for(int j=1;j<=num;j++){
if(res[i].grade[j]==-2)printf(" -");
else if(res[i].grade[j]<0)printf(" 0");
else printf(" %d",res[i].grade[j]);
}
printf("\n");
}
}