教训:
初始化已知的内容
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;
}