按解题总数生成排行榜。假设每个学生信息仅包括学号、解题总数;要求先输入n个学生的信息;然后按“解题总数”降序排列,若“解题总数”相同则按“学号”升序排列。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。 每组测试数据先输入1个正整数n(1 ≤ n ≤ 100),表示学生总数。然后输入n行,每行包括1个不含空格的字符串s(不超过8位)和1个正整数d,分别表示一个学生的学号和解题总数
时间: 2024-02-15 10:05:02 浏览: 87
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
struct Student {
string id;
int score;
}stu[N];
bool cmp(Student a, Student b) {
if (a.score != b.score) return a.score > b.score;
else return a.id < b.id;
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> stu[i].id >> stu[i].score;
}
sort(stu, stu + n, cmp);
for (int i = 0; i < n; i++) {
cout << i + 1 << " " << stu[i].id << " " << stu[i].score << endl;
}
}
return 0;
}
```
相关问题
解题排行榜中,按解题总数生成排行榜。假设每个学生信息仅包括学号、解题总数;要求先输入n个学生的信息;然后按“解题总数”降序排列,若“解题总数”相同则按“学号”升序排列。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。 每组测试数据先输入1个正整数n(1 ≤ n ≤ 100),表示学生总数。然后输入n行,每行包括1个不含空格的字符串s(不超过8位)和1个正整数d,分别表示一个学生的学号和解题总数。
好的,这是一道题目,需要编写程序来实现。以下是可能的 Python 代码实现:
```python
t = int(input()) # 输入测试数据组数
for i in range(t):
n = int(input()) # 输入学生总数
students = []
for j in range(n):
s, d = input().split() # 输入学生的学号和解题总数
d = int(d)
students.append((s, d)) # 将学生信息添加到列表中
students.sort(key=lambda x: (-x[1], x[0])) # 按解题总数降序排列,若解题总数相同则按学号升序排列
for s, d in students:
print(s, d) # 输出排名结果
```
这个程序首先输入测试数据组数 `t`,然后按照每组测试数据的格式读取输入。对于每组测试数据,程序将学生信息存储在一个列表中,然后使用 `sort` 方法对列表进行排序,排序的依据是先按解题总数降序排列,再按学号升序排列。最后,程序输出排名结果。
编写一个c语言程序解题排行榜中,按解题总数生成排行榜。假设每个学生信息仅包括学号、解题总数;要求先输入n个学生的信息;然后按“解题总数”降序排列,若“解题总数”相同则按“学号”升序排列。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。 每组测试数据先输入1个正整数n(1 ≤ n ≤ 100),表示学生总数。然后输入n行,每行包括1个不含空格的字符串s(不超过8位)和1个正整数d,分别表示一个学生的学号和解题总数。 输出格式: 对于每组测试数据,输出最终排名信息,每行一个学生的信息:排名、学号、解题总数。每行数据之间留一个空格。注意,解题总数相同的学生其排名也相同。
以下是一个解题排行榜的C语言程序,可以按照题目要求进行排名并输出排行榜。
```c
#include <stdio.h>
#include <string.h>
#define MAXN 100
struct Student {
char id[10];
int score;
};
int main()
{
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
struct Student stu[MAXN];
for (int i = 0; i < n; i++) {
scanf("%s%d", stu[i].id, &stu[i].score);
}
// 排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (stu[i].score < stu[j].score || (stu[i].score == stu[j].score && strcmp(stu[i].id, stu[j].id) > 0)) {
struct Student tmp;
tmp = stu[i];
stu[i] = stu[j];
stu[j] = tmp;
}
}
}
// 输出排行榜
printf("排名 学号 解题总数\n");
int rank = 1;
printf("%-5d %-10s %-10d\n", rank, stu[0].id, stu[0].score);
for (int i = 1; i < n; i++) {
if (stu[i].score == stu[i - 1].score) {
printf("%-5d %-10s %-10d\n", rank, stu[i].id, stu[i].score);
} else {
rank = i + 1;
printf("%-5d %-10s %-10d\n", rank, stu[i].id, stu[i].score);
}
}
}
return 0;
}
```
程序先读入测试数据的组数T,然后对于每组测试数据,先读入学生总数n和每个学生的信息,然后按照题目要求进行排序,最后输出排行榜信息。
排序采用了冒泡排序的方法,如果学生i的解题总数小于学生j的解题总数,或者学生i和学生j的解题总数相同但学生i的学号字典序大于学生j的学号字典序,就交换它们的位置。
输出排行榜时,从第一个学生开始遍历,如果当前学生的解题总数和前一个学生的解题总数相同,就把当前学生的排名设为前一个学生的排名,并输出当前学生的信息;否则,把当前学生的排名设为当前学生在数组中的下标加上1,输出当前学生的信息。
阅读全文