*算法初步—排序—A1075

思路:
1、考生提交答案有三种情况:未提交,编译未通过、编译通过。不妨建立学生结构体并把每道题的成绩初始化为-2(表示未提交),由于编译未通过是用-1表示,因此直接统一用高分替换低分即可
2、对于所有题目都未通过编译或未提交的不计入排名。可以用一个flag类型来判断,初始置为false,一旦某道题的输入成绩大于等于0,则变为true
3、根据题目要求编写排序函数

注意点:
1、在编写排序函数时,要把判断flag放在第一位(防止不符合条件的考生和得分全为0的考生混淆)
2、在判断满分次数时,只有第一次满分才加一,要注意以后再次提交满分成绩不算
3、注意边界条件,能通过编译但得分全为0也要计入排名

#include
#include
#include
using namespace std;

struct Stu
{
    int id,grade[10],sum,num_p; //准考证号,成绩,总分,满分题目个数 
    bool flag;                  //是否计入排名 
}stu[10005];

bool cmp(Stu a,Stu b)
{
    if(a.flag != b.flag)        //计入排名考生优先级大 
        return a.flag > b.flag;
    if(a.sum != b.sum)
        return a.sum > b.sum;
    if(a.num_p != b.num_p)
        return a.num_p > b.num_p;
    return a.id < b.id;
}

int main()
{
    int N,K,M,p[10];
    scanf("%d%d%d",&N,&K,&M); 
    for(int i=1;i<=N;i++) //初始化结构体 
    {       
        for(int j=1;j<=K;j++)
            stu[i].grade[j] = -2;
        stu[i].sum = 0;
        stu[i].num_p = 0;
        stu[i].flag = false;
    }
    for(int i=1;i<=K;i++)
        scanf("%d",&p[i]);
    for(int i=0;iint x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        stu[x].id = x;
        if(z >= 0)     //有成绩大于0即可计入排名 
            stu[x].flag = true;
        if(z == p[y] && z > stu[x].grade[y])  //某道题第一次得满分 
            stu[x].num_p++;
        if(stu[x].grade[y] < z)  //取题目的最高分 
            stu[x].grade[y] = z;    
    }
    for(int i=1;i<=N;i++)  //计算总分 
    {
        for(int j=1;j<=K;j++)
        {
            if(stu[i].grade[j] >= 0)
                stu[i].sum += stu[i].grade[j];
        }
    }
    sort(stu+1,stu+N+1,cmp);
    printf("1 %05d %d",stu[1].id,stu[1].sum);
    for(int i=1;i<=K;i++)
    {
        if(stu[1].grade[i] == -1)
            printf(" 0");
        else if(stu[1].grade[i] == -2)
            printf(" -");
        else
            printf(" %d",stu[1].grade[i]);
    }
    printf("\n");
    for(int i=2,j=1;i1 && stu[i].flag == true;i++)
    {
        if(stu[i].sum != stu[i-1].sum) //成绩相同名次不变,成绩不同名次后延 
            j = i;

        printf("%d %05d %d",j,stu[i].id,stu[i].sum);
        for(int t=1;t<=K;t++)
        {
            if(stu[i].grade[t] == -1) //编译未通过 
                printf(" 0");
            else if(stu[i].grade[t] == -2) //未提交 
                printf(" -");
            else
                printf(" %d",stu[i].grade[t]);
        }   
        printf("\n");                   
    }
    return 0;
} 

你可能感兴趣的:(PAT算法训练)