杭电 ACM Chapter One

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qinlingheshang/article/details/79782734

Section Three

排名

这里写图片描述
这里写图片描述

  • 认真读题,发现现实按成绩降序,再按学号升序

代码

#include <stdio.h>
#include <string.h>
typedef struct tagData{
    char Sno[25];//学号
    int a;//解题总数
    int B[10];//解决题目的编号
    int sum;//学生总分
}Info;
void InsertSort(Info *A,int N)
{
    int k,s;
    Info t,r;
    for(int i=1;i<N;i++)
    {
        t=A[i];
        k=i-1;
        while(t.sum>A[k].sum)
        {
            A[k+1]=A[k];
            k--;
            if(k==-1) break;
        }
        A[k+1]=t;
        s=k+1;
        while(s)
        {
            if(A[s].sum==A[s-1].sum)
            {
                if(strcmp(A[s].Sno,A[s-1].Sno)<0)
                {
                    r=A[s-1];
                    A[s-1]=A[s];
                    A[s]=r;
                }
                s--;
            }
            else break;
        }
    }
}
int main()
{
    int N;//考生人数
    int M,G;//M考题数,G分数线
    int score[20];//每道题的分数
    Info Data[1000],person[1000];
    int SN;//超过分数线的学生
    while(scanf("%d",&N)!=EOF && N!=0)
    {
        SN=0;
        scanf("%d%d",&M,&G);
        for(int i=0;i<M;i++) scanf("%d",&score[i]);
        for(int i=0;i<N;i++)
        {
            Data[i].sum=0;
            scanf("\n%s %d",Data[i].Sno,&Data[i].a);
            for(int j=0;j<Data[i].a;j++)
            {
                scanf("%d",&Data[i].B[j]);
                Data[i].sum += score[Data[i].B[j]-1];
            }
            if(G<=Data[i].sum)
            {
                person[SN]=Data[i];
                SN++;
            }
        }
        printf("%d\n",SN);
        InsertSort(person,SN);
        for(int i=0;i<SN;i++)
            printf("%s %d\n",person[i].Sno,person[i].sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qinlingheshang/article/details/79782734
今日推荐