一道排序问题
所遇到的坑点如下
1,提交成绩为-1表示未过编译器,但成绩应为0,也算提交过;
2,我定义结构体时开始在结构体内部初始化了,后来发现值完全没赋值上去,上网找资料发现
不能这样初始化。因为定义结构体时,并未给其分配内存,所以初值是无法存储的。应该声明结构体变量后,手工赋值。
3,对于没有提交过的考生不用输出
代码如下
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10050;
struct node{
int id;
int score[6];
int total;
int R;
int perfect;
bool issub;
}S[maxn];
int fmark[6];
bool cmp(node a,node b){
if(a.total!=b.total) return a.total>b.total;
else if(a.perfect!=b.perfect) return a.perfect>b.perfect;
else return a.id<b.id;
}
int main(){
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++)
{
scanf("%d",&fmark[i]);
}
int idnow,num,mark;
for(int i=1;i<=n;i++)
{
for(int l=1;l<=k;l++)
{
S[i].score[l]=-2;
}
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&idnow,&num,&mark);
if(S[idnow].score[num]<mark)
{ S[idnow].score[num]=mark;
S[idnow].issub=true;
}
}
for(int i=1;i<=n;i++)
{
S[i].id=i;
int sum=0;
for(int l=1;l<=k;l++){
if(S[i].score[l]>=0)
{ sum+=S[i].score[l];}
if(S[i].score[l]==fmark[l])
{S[i].perfect++;}
}
S[i].total=sum;
}
sort(S+1,S+n+1,cmp);
for(int i=1;i<=n;i++){
if(i>=2&&S[i].total==S[i-1].total)
{ S[i].R=S[i-1].R;
}
else {S[i].R=i;}
}
for(int i=1;i<=n;i++){
if(S[i].issub==true)
{ printf("%d %05d %d ",S[i].R,S[i].id,S[i].total);
for(int l=1;l<=k;l++){
if(S[i].score[l]==-1)
{printf("0");}
else if(S[i].score[l]>=0)
{
printf("%d",S[i].score[l]);
}
else {printf("-");}
if(l!=k)printf(" ");
}
printf("\n");
}
else break;
}
}