7-1 宿舍谁最高?哪里不对呀?

问题遇到的现象和发生背景

7-1 宿舍谁最高?
分数 30
作者 张栋
单位 福州大学
学校选拔篮球队员,每间宿舍最多有 4 个人。现给出宿舍列表,请找出每个宿舍最高的同学。定义一个学生类 Student,有身高 height,体重 weight 等。

输入格式:
首先输入一个整型数 n (1≤n≤10
6
),表示有 n 位同学。

紧跟着 n 行输入,每一行格式为:宿舍号 name height weight。
宿舍号的区间为 [0, 999999], name 由字母组成,长度小于 16,height,weight 为正整数。

输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学。

注意宿舍号不足 6 位的,要按 6 位补齐前导 0。

输入样例:
7
000000 Tom 175 120
000001 Jack 180 130
000001 Hale 160 140
000000 Marry 160 120
000000 Jerry 165 110
000003 ETAF 183 145
000001 Mickey 170 115
输出样例:
000000 Tom 175 120
000001 Jack 180 130
000003 ETAF 183 145

运行结果及报错内容

img

我的解答思路和尝试过的方法

img

#include <iostream>
#include <string>
using namespace std;

class Student
{
public:
    int dorm;
    string name;
    int h, w;
    Student(int a = 0, string n = "", int he = 0, int we = 0)
    {
        dorm = a;
        name = n;
        h = he;
        w = we;
    }
};

int main() {
    int n = 0;
    cin >> n;
    Student* s = new Student[n];
    for (int i = 0; i < n; i++)
    {
        int a, he, we;
        string n;
        cin >> a >> n >> he >> we;
        s[i] = Student(a, n, he, we);
    }//录入学生信息
    if (n > 1)
    {
        for (int p = n; p > 0; p--)
        {
            for (int q = 0; q < p - 1; q++)
            {
                Student temp;
                if (s[q].dorm > s[q + 1].dorm)
                {
                    temp = s[q];
                    s[q] = s[q + 1];
                    s[q + 1] = temp;
                }
            }
        }//将学生按宿舍号进行由小到大的排序
        Student max; bool nd = true; int t = 0;
        if (s[0].dorm != s[1].dorm)
        {
            printf("%06d ", s[0].dorm);
            cout << s[0].name << " " << s[0].h << " " << s[0].w << "\n";
        }
        for (int r = 0; r < n - 1; r++)
        {

            if (s[r].dorm == s[r + 1].dorm)//有多个,进行宿舍内部比较
            {
                if (nd == true)//首次进入宿舍赋值
                {
                    max = s[r];
                    nd = false;
                }
                if (max.h < s[r + 1].h)//比较出最高的学生记为max
                {
                    max = s[r + 1];
                }
                if (s[r+1].dorm != s[r +2].dorm||r==n-2)//接下来就是下一个宿舍的话或者接下来没有宿舍了输出
                {
                    nd = true;
                    printf("%06d ", max.dorm);
                    cout << max.name << " " << max.h << " " << max.w << "\n";
                }
            }
            else if (s[r].dorm != s[r + 1].dorm && s[r].dorm != s[r - 1].dorm)//宿舍内单个人,无需比较,直接输出
            {
                max = s[r];
                printf("%06d ", max.dorm);
                cout << max.name << " " << max.h << " " << max.w << "\n";
            }
        }
        if (s[n - 2].dorm != s[n - 1].dorm)
        {
            printf("%06d ", s[n - 1].dorm);
            cout << s[n - 1].name << " " << s[n - 1].h << " " << s[n - 1].w << "\n";
        }
    }
    return 0;
}





别处看到的两次排序方法(个人记录用)

#include <iostream>
#include <string>
using namespace std;

class Student
{
public:
    int dorm;
    string name;
    int h, w;
    Student(int a = 0, string n = "", int he = 0, int we = 0)
    {
        dorm = a;
        name = n;
        h = he;
        w = we;
    }
};

int main() {
    int n = 0,r=0;
    cin >> n;
    Student* s = new Student[n];
    for (int i = 0; i < n; i++)
    {
        int a, he, we;
        string n;
        cin >> a >> n >> he >> we;
        s[i] = Student(a, n, he, we);
    }//录入学生信息
    if (n > 1)
    {
        for (int p = n; p > 0; p--)
        {
            for (int q = 0; q < p - 1; q++)
            {
                Student temp;
                if (s[q].dorm > s[q + 1].dorm)
                {
                    temp = s[q];
                    s[q] = s[q + 1];
                    s[q + 1] = temp;
                }
            }
        }//将学生按宿舍号进行由小到大的排序
        for (; r < n - 1; )

        {
            if (s[r].dorm == s[r + 1].dorm)
            {
                if (s[r].h > s[r + 1].h)
                {
                    Student temp1;
                    temp1 = s[r];
                    s[r] = s[r + 1];
                    s[r + 1] = temp1;
                }//进行宿舍内按个子高低进行排序
                r = r + 1;
            }
            else
            {
                printf("%06d ", s[r].dorm);
                cout << s[r].name << " " << s[r].h << " " << s[r].w << "\n";

                r = r + 1;
            }
        }
        printf("%06d ", s[r].dorm);
        cout << s[r].name << " " << s[r].h << " " << s[r].w << "\n";
    }
    else
    {
        printf("%06d ", s[0].dorm);
        cout << s[0].name << " " << s[0].h << " " << s[0].w << "\n";
    }
    return 0;
}