zhagghfhgf @ 2024-11-21 08:37:04
#include <stdio.h>
#include <stdlib.h>
#define N 5000000
int q[N], q1[N], q2[N];
int n, m, a, b, c;
void swap(int* p1, int* p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void quick_sort(int q[], int r, int l) {
if (r >= l) return;
int x = r - 1, j = l + 1;
int mid = q[(r + l) / 2];
while (x < j) {
while (q[++x] < mid);
while (q[--j] > mid);
if (x < j) {
swap(&q[x], &q[j]);
swap(&q1[x], &q1[j]);
swap(&q2[x], &q2[j]);
}
}
quick_sort(q, r, j);
quick_sort(q, j + 1, l);
}
int main() {
scanf("%d", &m);
int i;
for (i = 0;i < m;i++) {
scanf("%d%d%d", &a, &b, &c);
n = i + 1;
q[i] = a + b + c, q2[i] = a;
q1[i] = n;
}
quick_sort(q, 0, m - 1);
for (i = m - 1;i > m - 6;i--) {
if (q[i] > q[i - 1]) {
printf("%d %d\n", q1[i], q[i]);
}
else if (q[i] == q[i - 1] && q2[i] < q2[i - 1]) {
printf("%d %d\n", q1[i - 1], q[i - 1]);
printf("%d %d\n", q1[i], q[i]);
i--;
}
else if (q[i] == q[i - 1] && q2[i] == q2[i - 1] && q1[i] < q1[i - 1]) {
printf("%d %d\n", q1[i], q[i]);
}
else if (q[i] == q[i - 1] && q2[i] == q2[i - 1] && q1[i] > q1[i - 1]) {
printf("%d %d\n", q1[i - 1], q[i - 1]);
printf("%d %d\n", q1[i], q[i]);
i--;
}
else if (q[i] == q[i - 1] && q2[i] > q2[i - 1]) {
printf("%d %d\n", q1[i], q[i]);
}
}
return 0;
}
by Zyhx @ 2024-11-21 09:36:32
你这个多少有点复杂了,推荐直接用一个结构体存成绩和学号,排序直接调库用sort,再写一个cmp函数,对比一下成绩总和和语文乘积还有学号就行,不超过20行解决,你这个我下载过#6的数据,没看出来问题,就是有点问题,你这个应该是当总成绩相同先输出学号小的那个了,可以看看我的思路,或者你仔细看看排序和比较那里,有问题再问
by zhagghfhgf @ 2024-11-21 14:33:44
@Zyhx,好的好的,谢谢大佬,结构体的排序我写完这个才学的,一开始不知道怎么排
by Zyhx @ 2024-11-21 15:27:47
@zhagghfhgf 没事,给个code你可以参考一下
bool cmp(node a,node b){//node是结构体名,a,b是结构体变量
if(a.score==b.score&&a.yuwen==b.yuwen) return a.id<b.id;//总成绩相同,语文成绩相同,则对比两个人的学号
else if(a.score==b.score&&a.yuwen!=b.yuwen) return a.yuwen>b.yuwen;//总成绩相同,语文成绩不同,则对比两人的语文成绩
else return a.score>b.score;//总成绩不同就对比两人总成绩大小
//score表示总成绩,yuwen表示语文成绩,id就是学号,可以这样写
}
这个是这题的排序思路,调用std::sort排序非常方便
by zhagghfhgf @ 2024-11-21 16:21:20
@Zyhx谢谢大佬,过了,非常感谢