「NOIP 2007 普及组」奖学金 审核通过

lyh046 蔚蓝档案 2024-10-24 19:46:34 8
我们知道,每名学生是通过总分进行首次排序,于是,我们可以通过定义结构体后进行冒泡排序,代码如下:
struct node {
    int yu, shu, ying;
} t[10000];//结构体

for (int i = n; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            if (all[j] < all[j + 1]) {//如果总分all[j]<all[j+1]便交换值,使排序按从大到小排
                swap(all[j], all[j + 1]);
                swap(num[j], num[j + 1]);
                swap(t[j].yu, t[j + 1].yu);//冒泡排序
            }
        }
    }

接着,据题意可知,我们要对分数相同的人的语文进行二次排序,代码同上,修改if语句便可

最后,我们输出前五名便可,总代码如下:
struct node {
    int yu, shu, ying;
} t[10000];
int num[100000], all[1000000];
int main() {
    int n, sum = 1;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        scanf("%d%d%d", &t[i].yu, &t[i].shu, &t[i].ying);
        all[sum] = all[sum] + t[i].yu + t[i].shu + t[i].ying;//计算总分  
        num[sum] += i;//将学号载入数组
        sum++;
    }
    for (int i = n; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            if (all[j] < all[j + 1]) {
                swap(all[j], all[j + 1]);
                swap(num[j], num[j + 1]);
                swap(t[j].yu, t[j + 1].yu);//排序总成绩的同时交换语文成绩  
            }
        }
    }
    for (int i = n; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            if (all[j] == all[j + 1] && t[j].yu < t[j + 1].yu) {
                swap(all[j], all[j + 1]);
                swap(num[j], num[j + 1]);
                swap(t[j].yu, t[j + 1].yu);排序语文成绩的同时交换总成绩  
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        if (all[i] == all[i + 1] && num[i] > num[i + 1] && t[i].yu == t[i + 1].yu) {
            swap(num[i], num[i + 1]);//对学号进行排序  
        }
    }
    for (int i = 1; i <= 5; i++) {
        printf("%d %d\n", num[i], all[i]);//输出前五名的成绩及学号  
    }
}//代码还是不够简洁,如有大神指教,洗耳恭听(抱拳)
{{ vote && vote.total.up }}