#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n,k,m;//n用户数量,k题目个数,m提交信息个数
int fullmark[6];//每个题目的满分分数
struct user{
int id;//用户id
int sflag;//标记是否提交并且通过了编译,是否输出
int total_score;//总分
int fullnumber;//满分个数
int p[6];//每个题的分数
int pflag[6];//标记每个题目,是输出-还是数字
}stu[10005];
void init(){
int i,j;
for(i = 1; i <= n; i++){
stu[i].id = i;
stu[i].sflag = 0;
stu[i].fullnumber = 0;
stu[i].total_score = 0;
for(j = 1; j <= k; j++){
stu[i].p[j] = 0;
stu[i].pflag[j] = 0;
}
}
}
int cmp(const void *a,const void *b){
struct user* c = (struct user*)a;
struct user* d = (struct user*)b;
if(c->total_score == d->total_score){
if(c->fullnumber == d->fullnumber){
return c->id > d->id;
}
return c->fullnumber < d->fullnumber;
}
return c->total_score < d->total_score;
}
int main(){
int i,j;
scanf("%d%d%d",&n,&k,&m);
init();
for(i = 1; i <= k; i++){
scanf("%d",&fullmark[i]);
}//输入每个题的总分
for(i = 1; i <= m; i++){
int id,pid,score;
scanf("%d%d%d",&id,&pid,&score);
if(score > -1){
stu[id].sflag = 1;//首先看分数,如果分数大于-1,说明这个用户已经编译通过了一次,那么输出rank时要输出他
if(score > stu[id].p[pid]){//如果新提交的分数大于原来分数,更新这道题的分数
stu[id].p[pid] = score;
}
}
stu[id].pflag[pid] = 1;//这道题提交过了应该输出分数,不是'-'
}
for(i = 1; i <= n; i++){//算总分和满分数
if(!stu[i].sflag){
stu[i].total_score = -2;
continue;
}
for(j = 1; j <= k; j++){
stu[i].total_score += stu[i].p[j];//算总分每个加起来即可
if(stu[i].p[j] == fullmark[j]){//如果有满分的,满分数加一
stu[i].fullnumber++;
}
}
}
//排序
qsort(stu+1,n,sizeof(stu[1]),cmp);
//输出
int ranks = 1;
int num = 0;
for(i = 1; i <= n; i++){
num++;
if(!stu[i].sflag)break;
if(i == 1){
printf("%d",ranks);
}
else{
if(stu[i].total_score == stu[i-1].total_score){
printf("%d",ranks);
}
else{
ranks = num;
printf("%d",ranks);
}
}//输出rank
printf(" %05d %d",stu[i].id,stu[i].total_score);
for(j = 1; j <= k; j++){
if(!stu[i].pflag[j]){
printf(" -");
}
else{
printf(" %d",stu[i].p[j]);
}
}//输出分数
puts("");
}
return 0;
1.注意全0也要输出
#include <string.h>
#include <stdlib.h>
int n,k,m;//n用户数量,k题目个数,m提交信息个数
int fullmark[6];//每个题目的满分分数
struct user{
int id;//用户id
int sflag;//标记是否提交并且通过了编译,是否输出
int total_score;//总分
int fullnumber;//满分个数
int p[6];//每个题的分数
int pflag[6];//标记每个题目,是输出-还是数字
}stu[10005];
void init(){
int i,j;
for(i = 1; i <= n; i++){
stu[i].id = i;
stu[i].sflag = 0;
stu[i].fullnumber = 0;
stu[i].total_score = 0;
for(j = 1; j <= k; j++){
stu[i].p[j] = 0;
stu[i].pflag[j] = 0;
}
}
}
int cmp(const void *a,const void *b){
struct user* c = (struct user*)a;
struct user* d = (struct user*)b;
if(c->total_score == d->total_score){
if(c->fullnumber == d->fullnumber){
return c->id > d->id;
}
return c->fullnumber < d->fullnumber;
}
return c->total_score < d->total_score;
}
int main(){
int i,j;
scanf("%d%d%d",&n,&k,&m);
init();
for(i = 1; i <= k; i++){
scanf("%d",&fullmark[i]);
}//输入每个题的总分
for(i = 1; i <= m; i++){
int id,pid,score;
scanf("%d%d%d",&id,&pid,&score);
if(score > -1){
stu[id].sflag = 1;//首先看分数,如果分数大于-1,说明这个用户已经编译通过了一次,那么输出rank时要输出他
if(score > stu[id].p[pid]){//如果新提交的分数大于原来分数,更新这道题的分数
stu[id].p[pid] = score;
}
}
stu[id].pflag[pid] = 1;//这道题提交过了应该输出分数,不是'-'
}
for(i = 1; i <= n; i++){//算总分和满分数
if(!stu[i].sflag){
stu[i].total_score = -2;
continue;
}
for(j = 1; j <= k; j++){
stu[i].total_score += stu[i].p[j];//算总分每个加起来即可
if(stu[i].p[j] == fullmark[j]){//如果有满分的,满分数加一
stu[i].fullnumber++;
}
}
}
//排序
qsort(stu+1,n,sizeof(stu[1]),cmp);
//输出
int ranks = 1;
int num = 0;
for(i = 1; i <= n; i++){
num++;
if(!stu[i].sflag)break;
if(i == 1){
printf("%d",ranks);
}
else{
if(stu[i].total_score == stu[i-1].total_score){
printf("%d",ranks);
}
else{
ranks = num;
printf("%d",ranks);
}
}//输出rank
printf(" %05d %d",stu[i].id,stu[i].total_score);
for(j = 1; j <= k; j++){
if(!stu[i].pflag[j]){
printf(" -");
}
else{
printf(" %d",stu[i].p[j]);
}
}//输出分数
puts("");
}
return 0;
}