大佬们,#6和#9郭不了,求调

P1093 [NOIP2007 普及组] 奖学金

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谢谢大佬,过了,非常感谢


|