教训:
初始化已知的内容
1.通常来说是数组
2.其次给出总数量的序号

这道题是真的有问题,最开始我把标记设错了,后来改正确一直在最后一个测试点卡着。
我考虑到了另一种情况,但是本题似乎没有涉及:
即第一次提交通过编译并有得分,但是第二次出现了编译错误的记录,这个时候是不能覆盖原得分的,但是后来认真一想,这种情况确实可能存在,即第一次只得了部分分,后来换种写法导致了编译错误。
另一个让我奇怪的地方是学号的初始化的问题。
我之所以最后一个测试点不通过,主要是学号的初始化没弄正确,我想着在输入的过程中就记录学号,但是还存在一种情况,就是某个学生没有任何的提交记录,所以读入数据中没有这个学号的值,此时只能在输入前就初始化好。这个问题很关键,错得不怨。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 1e4+5;
int n,k,m;
struct node{
	int total,id,cnt,flag;
	int arr[6]={0},vis[6]={0};
}Node[maxn];

bool cmp(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 full[6]={0};
	scanf("%d%d%d",&n,&k,&m);
	for(int i=1;i<=k;i++){
		scanf("%d",&full[i]);
	}
	for(int i=1;i<=n;i++){
		Node[i].id=i;  //因为有没做任何提交的学生,所以要在外面初始化 
	}
	int id,no,score;
	for(int i=0;i<m;i++){
		scanf("%d%d%d",&id,&no,&score);
		Node[id].arr[no] = max(score, Node[id].arr[no]);
		
		if(score == -1 && Node[id].vis[no]==0) Node[id].vis[no] = 2;  //首次,编译错误的记为2,有得分的情况下编译错误,需要保留有得分的记录 
		else Node[id].vis[no] = 1;  //有得分的记为1 
	}
	for(int i=1;i<=n;i++){
		int ta=0,cnta=0,flag=0;
		for(int j=1;j<=k;j++){
			ta += Node[i].arr[j];
			if(Node[i].arr[j] == full[j]) cnta++;
			if(Node[i].vis[j]==1) flag=1;
		}
		Node[i].total=ta;
		Node[i].cnt = cnta;
		Node[i].flag = flag;	
	}	
	sort(Node+1,Node+n+1,cmp);
	int u=1;
	for(int i=1;i <= n ;i++){
		if(Node[i].flag){
			if(i>1 && Node[i].total != Node[i-1].total){
				u = i;
			}
			printf("%d %05d %d",u,Node[i].id,Node[i].total);
			for(int j=1;j<=k;j++){
				if(Node[i].vis[j] != 0) printf(" %d",Node[i].arr[j]);
				else printf(" -");
			}	
			printf("\n");
			
		}
	
	}
	return 0;
}