题目:期中考试已经结束了,计算机系将要进行年级成绩排名。排名的规则如下:
输出格式
输出共有N行,按照名次从高到低每行输出一名学生的信息(若名次相同,则学号小的先输出),依次为:名次,学号,平均成绩,其间用一个空格隔开。
输入样例
样例一
5
1000 95
1001 100
1002 94
1006 95
1007 100
样例二
20
2191 37
5618 47
1146 15
6029 4
2757 16
5968 83
1205 46
7473 13
2301 35
1343 1
6113 31
4238 15
1709 43
4330 47
8444 5
3282 9
2549 68
5415 75
6875 50
1757 10
输出样例
样例一
1 1001 100
1 1007 100
3 1000 95
3 1006 95
5 1002 94
样例二
1 5968 83
2 5415 75
3 2549 68
4 6875 50
5 4330 47
5 5618 47
7 1205 46
8 1709 43
9 2191 37
10 2301 35
11 6113 31
12 2757 16
13 1146 15
13 4238 15
15 7473 13
16 1757 10
17 3282 9
18 8444 5
19 6029 4
20 1343 1
我的答案:#include <stdio.h>
#define N 1000
int main() {
int n, i, j, t, k, m;
int a[N], c[N], b[N];
scanf("%d\n", &n);
for (i = 0; i <= n - 1; i++) {
scanf("%d %d\n", &b[i], &a[i]);
}
for (i = 0; i <= n - 1; i++) {
for (j = 0; j <= n - i - 1; j++) {
if (a[j] < a[j + 1]) {
t = a[j + 1];
a[j + 1] = a[j];
a[j ] = t;
m = b[j + 1];
b[j + 1] = b[j ];
b[j] = m;
} else {
t = a[j ];
a[j ] = a[j + 1];
a[j + 1] = t;
m = b[j ];
b[j ] = b[j + 1];
b[j + 1] = m;
}
}
}
k = 1;
c[0] = 1;
for (i = 1; i <= n; i++) {
if (a[i] != a[i - 1]) {
c[i] = ++k;
} else {
c[i] = k;
k = k++;
}
}
for (i = 0; i < n; i++) {
printf("%d %d %d\n", c[i], b[i], a[i]);
}
return 0;
}
运行答案出错,两个小时没找出来bug在哪里
int main() {
int grades[1000][2]; // 1000个二元数组,保存学号和成绩
int n;
// 输入成绩
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d%d", &grades[i][0], &grades[i][0]);
}
for (int i = 0; i < n; i++){
for (int j = 0; j < i; j++) {
// 如果成绩少
if (grades[i][1] > grades[j][1]) {
//交换成绩
int temp = grades[i][1];
grades[i][1] = grades[j][1];
grades[j][1] = temp;
//交换学号
temp = grades[i][0];
grades[i][0] = grades[j][0];
grades[j][0] = temp;
}
// 如果成绩相同,学号多
else if (grades[i][1] == grades[j][1] && grades[i][0] < grades[j][0]) {
//交换成绩
int temp = grades[i][1];
grades[i][1] = grades[j][1];
grades[j][1] = temp;
//交换学号
temp = grades[i][0];
grades[i][0] = grades[j][0];
grades[j][0] = temp;
}
}
}
// keep 自己在纸上理解一下
int keep = 0;
int keep_rank = 0;
for (int i = 0; i < n; i++){
if (!keep) {
keep_rank = i;
}
if (i != n - 1 && grades[i][1] == grades[i + 1][1]) { // 避免超出数组范围
keep = 1;
}
else {
keep = 0;
}
printf("%d %d %d\n", keep_rank, grades[i][0], grades[i][1]);
}
}