#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
struct student{
int perfect;
int rank;
int sid;
vector<int> score;
int sum;
bool isCompile;
}Student[100010];
int sid;
bool cmp(student a,student b){
if(a.sum!=b.sum){
return a.sum>b.sum;
} else if(a.perfect!=b.perfect){
return a.perfect>b.perfect;
}else{
return a.sid<b.sid;
};
}
int main() {
int N,K,M;
cin>>N>>K>>M;
int P[K];
for(int i =1;i<=K;i++){
cin>>P[i];
}
vector<student> v(N+1);
// cout<<v.size();
int flag[100010]={0};
for(int i = 1;i<=N;i++){
v[i].score.resize(K+1,-3);
}
for (int i = 0; i <M ; i++) {
int pth;
cin>>sid;
cin>>pth;
int cur_score;
cin >> cur_score;
int n = v[sid].score[pth];
v[sid].score[pth]=max(n,cur_score);
if(cur_score!=-1){
v[sid].isCompile=true;
}
v[sid].sid =sid;
v[sid].perfect =0;
}
//
//
for(int i =1;i<=N;i++){
int sum =0;
for(int j =1;j<=K;j++){
if(v[i].score[j]!=-1&&v[i].score[j]!=-3){
sum = sum + v[i].score[j];
v[i].sum = sum;
}
if(v[i].score[j]==P[j]){
v[i].perfect ++;
}
}
}
//
//
// set<int> s;
// for(int i = 0;i<v.size();i++){
// s.insert(v[i].sid);
// }
// vector<int> m ;
// for(auto it:s){
// m.push_back(it);
// }
//sort 之后下标从1 7 变成 0-6(原来0有元素但是我们不用 用1-7 排序之后 0-6位是我们自己的元素了 7元素不用)
sort(v.begin(),v.end(),cmp);
v[0].rank =1;
for(int i =1;i<=N;i++){
if(v[i].sum==v[i-1].sum){
v[i].rank = v[i-1].rank;
} else{
v[i].rank =i+1;
}
}
// cout<<Student[m[2]].sum<<endl;
for(int i =0;i<v.size();i++){
if(v[i].isCompile){
printf("%d ",v[i].rank);
printf("%05d ",v[i].sid);
printf("%d ",v[i].sum);
for(int j=1;j<=K-1;j++){
if(v[i].score[j]!=-3){
if(v[i].score[j]==-1){
printf("0 ");
} else{
printf("%d ",v[i].score[j]);
}
} else{
printf("- ");
}
}
if(v[i].score[K]!=-3){
if(v[i].score[K]==-1){
printf("0");
} else{
printf("%d",v[i].score[K]);
}
} else{
cout<<"-";
}
cout<<endl;
} else{
}
}
return 0;
}
最后一个测试点:没通过任何编译的不输出 通过编译哪怕全0 也输出 是否通过编译用 bool isCompile来代表
坑2:cout会超时 200ms限制有点蠢了 不过以后的限制都是400ms以上 超时几率小很多 大胆用cout吧。
坑3:逻辑较为复杂。很浪费时间。