zoukankan      html  css  js  c++  java
  • NOJ 成绩排名

                                                                                成绩排名

    时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
    总提交 : 1692            测试通过 : 281 

    题目描述

    每学期考试结束,教务处老师都要对学生成绩进行一些统计。请你帮助教务处老师对学生成绩从高到低进行排名。成绩相同,排名序号相同,先后出现顺序与原始次序相同。



    输入

    第一行是一个正整数:测试用例数目,最多为100。之后,每个测试用例包括:

    l       第1行,含一个整数n:1≤n≤100,表示学生数

    l       n行,每一行含一个字符串(长度不超过10)、一个整数,分别表示学生的学号、成绩

    输出

    对于每个测试用例:

    l       输出“Case #:”,#表示序号

    l       输出n行,每一行含排名序号、学生学号、成绩

    注意:输出部分的结尾要求包含一个多余的空行。

    样例输入

    2
    5
    B05021924 90
    B07030901 91
    B07030419 90
    B07021027 93
    B06060606 87
    1
    D0408 100

    样例输出

    Case 1:
    1 B07021027 93
    2 B07030901 91
    3 B05021924 90
    3 B07030419 90
    5 B06060606 87
    Case 2:
    1 D0408 100

    题目来源

    “IBM南邮杯”个人赛2009


    分析:这一题WA了很久,之前是题目要求没好好看,以为排序输出可以就是普通的1,2,3,4,5………,后来第二遍审题才注意分数相同的名次相同,还有不需要按照学号排序,
    在分数相同的情况下按照出现的先后顺序即可。
    尽管理解了题目意思,但还是WA了好久,后来向昱帝哥哥求助。
    我的方法是用两个数组分别存储学号和成绩,用冒泡排序然后输出。
    但还是WA,让人抓狂,后来昱帝哥哥改了一下,把输出改了,就好了,在此无限膜拜昱帝哥哥。
    输出很简洁,我之前的相当复杂==

    下面贴出AC代码:
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int T;
    int n;
    int grade[110];  //成绩
    char id[110][20];  //学号
    int main()
    {
    //    freopen("in.txt","r",stdin);
        scanf("%d",&T);  //样例数
        for(int m=1;m<=T;m++)
        {
            scanf("%d",&n);  //人数
            for(int i=0;i<n;i++)
            {
                scanf("%s%d",id[i],&grade[i]);
            }
            printf("Case %d:
    ",m);
            int tag=1;
            for(int i=1; i<n && tag; i++ )       //没有元素交换则停止循环
            {
                tag = 0;  //0表示没有交换
                for(int j=0; j<n-i; j++ )
                {
                    if( grade[j] < grade[j+1] )
                    {
                   //     cout<<i<<" "<<j<<endl;
                        int tmp = grade[j];
                        grade[j] = grade[j+1];
                        grade[j+1] = tmp;
                        char p[102];
                        strcpy(p,id[j]);
                        strcpy(id[j],id[j+1]);
                        strcpy(id[j+1],p);
                        tag = 1;
                    }
                }
           }
           int pos = 1;
           cout<<pos<<" "<<id[0]<<" "<<grade[0]<<endl;
           for(int i=1;i<n;i++)
           {
               if(grade[i] != grade[i-1])
                   pos = i + 1;
               cout<<pos<<" "<<id[i]<<" "<<grade[i]<<endl;
           }
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    NOIP2011 D1T1 铺地毯
    NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
    POJ 2513 trie树+并查集判断无向图的欧拉路
    599. Minimum Index Sum of Two Lists
    594. Longest Harmonious Subsequence
    575. Distribute Candies
    554. Brick Wall
    535. Encode and Decode TinyURL(rand and srand)
    525. Contiguous Array
    500. Keyboard Row
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965449.html
Copyright © 2011-2022 走看看