欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

成绩排序

程序员文章站 2024-03-21 20:08:10
...

【T4】

题目(from 清华大学): 输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。

  • 输入描述:

    输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。

  • 输出描述:

    按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开。

  • 示例1

    输入:
    3
    0
    fang 90
    yang 50
    ning 70

    输出:
    fang 90
    ning 70
    yang 50

这道题真是难以描述——解题十分钟,通过十小时。
解题思路:建立一个结构体具有名字和成绩两个属性,建立其对象数组,对其分数进行冒泡排序,需要注意的是:题目中提到相同成绩都按先录入排列在前的规则处理,所以本来想只写一次冒泡排序,然后根据规则从头打印或者从尾打印的想法就被pass掉了。

重点重点重点来了!!!为啥一直通不过。。。原因是:
这个平台的测试实例是这样的:

3
0
fang 90
yang 50
ning 70
2
1
fa 93
gao 55
5
0
fang 90
yang 50
ning 70
fei 33
wang 68

但是我以为是这样的(一次测试仅一个案例):
3
0
fang 90
yang 50
ning 70

这下终于知道为啥总是判定我输出为空或者输出不全了。。。
利用一个while循环来读入并且进行判断就解决了555(找了三个同学都没商量出来为啥,最后还是奕哥对比通过代码发现的问题,结果她的结论就是再也不在牛客网上做题了dswl)

PS: 但我现在还不清楚平台到底对不同的类型怎么测试,有摸清楚套路的可爱可以教教我嘛。。。

代码实现:

#include<iostream>
using namespace std;

struct Student{
    string name;
    int score;
};
int main(){
    
    int num,t;
    while(cin>>num>>t){
         Student stu[num];
    for(int i=0;i<num;i++){
        cin.ignore();
        cin>>stu[i].name>>stu[i].score;
    }
    
    
    if(t==0){//降序  先是最大的
         for(int i=0;i<num-1;i++){
            for(int j=0;j<num-i-1;j++){
                if(stu[j].score<stu[j+1].score){
                    Student s=stu[j];
                    stu[j]=stu[j+1];
                    stu[j+1]=s;
                }
            }
        }
    }else if(t==1){
        for(int i=0;i<num-1;i++){
            for(int j=0;j<num-i-1;j++){
                if(stu[j].score>stu[j+1].score){
                    Student s=stu[j];
                    stu[j]=stu[j+1];
                    stu[j+1]=s;
                }
            }
        }
    }

     for(int i=0;i<num;i++){
        cout<<stu[i].name<<" "<<stu[i].score<<endl;
    }
    }
    
   
    return 0;
}

这道题从“妈耶,我会做”的欢喜到一直通不过还找不出bug想自闭到我现在开了,开学快乐大葛们!