杨老师的课(JSU-ZJJ)

题目描述

杨老师是一位优秀的算法课教师,他非常注重学生的动手能力。因此,他通过在judge online平台上布置作业来检查学生的学习情况,并依据做题情况给定学生的成绩排名。
杨老师给定了一个最少的做题数目t,学生必须完成至少t的题的数目,然后他给每一个学生做的题目打了一个平均分。最终排名的规则是,必须完成t个以上的数目,然后按照平均分排名,分数相等则按姓名的字典序排名。现在给定一个数字m,请列出前m名的学生姓名。
输入
有多组测试数据。
每组数据的第一行为一个数N(1 <= N <= 1000),表示有多少学生(输入0表示程序结束)。
接下来的N行,每一行开始为一个字符串X(length(X) <=10),表示学生姓名;然后有一个数字Y(1 <= Y <= 100),表示该学生所做题目的平均分,最后一个数字Z(1 <= Z <= 50),表示学生做的题目数量。
接下来有一行,仅一个数字m(1 <= M <= N),表示求前多少名的学生。
最后一行为一个数字,表示Mr.Yang要求的最少做题数量。
输出
对于每组测试数据,按名次列出前m名的学生姓名。

分析;

此题在做的时候,我因为未看到输入0程序结束,所以导致错了几次。本题需注意的地方是,字典序是用升序排。

#include"stdio.h"
#include"string.h"
int main()
{
    int n,y[1001],z[1001],m,t,O;
    char a[1001][11],changeB[11],mid;
    int i,j,k,l,change;
    while(~scanf("%d",&n))
    {   if(n==0)
          break;
        l=n;
        while(n--)
        {   scanf("%c",&mid);
            scanf("%s",a[n]);
            scanf("%d%d",&y[n],&z[n]);

        }
        scanf("%d%d",&m,&t);
        for(i=0;i<l-1;i++)
            for(j=i;j<l;j++)
        {
            if(y[i]<y[j])
            {   change=z[i];
                z[i]=z[j];
                z[j]=change;
                change=y[i];
                y[i]=y[j];
                y[j]=change;
                strcpy(changeB,a[i]);
                strcpy(a[i],a[j]);
                strcpy(a[j],changeB);

            }
            if(y[i]==y[j]&&strcmp(a[i],a[j])>0)
            {   change=z[i];
                z[i]=z[j];
                z[j]=change;
                change=y[i];
                y[i]=y[j];
                y[j]=change;
                strcpy(changeB,a[i]);
                strcpy(a[i],a[j]);
                strcpy(a[j],changeB);

            }
        }
        for(i=0;i<m;i++)
        {
            if(z[i]>=t)
                printf("%s\n",a[i]);
            else
                m++;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/84065060