分析:
- 首先0和-1的区别,-1代表未能通过,而0代表通过了但是为0分。
- 如果一个参与者任何题目都为-1就不输出,否则就输出,注意:如果有0也是输出的(这是一个测试点)
- ==解决方法:==用-2记录开始分数,flag代表是否可以输出,只要有一道题分数大于0就让flag=true
代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
struct node{
int id;
int score[6]={-2,-2,-2,-2,-2,-2};
int rank=0;
int perfect=0;
bool flag;
};
map<int,node>arr;
vector<node>brr;
int p[6];
int cmd(node a,node b){
if(a.rank==b.rank){
if(a.perfect==b.perfect)
return a.id<b.id;
return a.perfect>b.perfect;
}
return a.rank>b.rank;
}
int main(){
int n,k,m;
cin>>n>>k>>m;
for(int i=1;i<=k;++i){
scanf("%d",&p[i]);
}
for(int i=0;i<m;++i){
int id,pro,s;
scanf("%d %d %d",&id,&pro,&s);
if(s<=-1){
s=0;
}else{
arr[id].flag=1;
}
arr[id].id=id;
if(arr[id].score[pro]==-2){
arr[id].rank+=s;
arr[id].score[pro]=s;
if(s==p[pro])
arr[id].perfect++;
}else if(arr[id].score[pro]<s){
arr[id].rank-=arr[id].score[pro];
arr[id].rank+=s;
arr[id].score[pro]=s;
if(s==p[pro])
arr[id].perfect++;
}
}
for(auto it=arr.begin();it!=arr.end();++it){
brr.push_back(it->second);
}
sort(brr.begin(),brr.end(),cmd);
int rank=brr[0].rank;int temp=1;
for(int i=0;i<brr.size();++i){
if(!brr[i].flag)
continue;
if(brr[i].rank==rank)
printf("%d %05d %d",temp,brr[i].id,rank);
else{
rank=brr[i].rank;
temp=i+1;
printf("%d %05d %d",temp,brr[i].id,rank);
}
for(int j=1;j<=k;++j){
if(brr[i].score[j]!=-2)
printf(" %d",brr[i].score[j]);
else
printf(" -");
}
cout<<endl;
}
return 0;
}