首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

九度 1023 EXCEL 排序:多關鍵字自定義比較器

     編輯:關於C++

題目要求

讀取 N 條記錄(學號、姓名、成績),按第 M 關鍵字排序:
1→學號升序;2→姓名升序,學號作第二關鍵字;3→成績升序,學號作第二關鍵字。輸出格式固定。

解法核心

定義結構體存儲記錄,編寫三個比較函數分別對應三種排序規則,調用 std::sort 即可。關鍵在於比較函數正確處理「主關鍵字相等時按次關鍵字」的邏輯。

完整代碼

#include <bits/stdc++.h>
using namespace std;

struct Record {
    char id[10], name[10];
    int score;
} a[100010];

bool cmp1(const Record& A, const Record& B) {
    return strcmp(A.id, B.id) < 0;
}
bool cmp2(const Record& A, const Record& B) {
    int t = strcmp(A.name, B.name);
    return t ? t < 0 : strcmp(A.id, B.id) < 0;
}
bool cmp3(const Record& A, const Record& B) {
    if (A.score != B.score) return A.score < B.score;
    return strcmp(A.id, B.id) < 0;
}

int main() {
    int n, m, cas = 1;
    while (scanf("%d%d", &n, &m) == 2 && (n || m)) {
        for (int i = 0; i < n; ++i) scanf("%s%s%d", a[i].id, a[i].name, &a[i].score);
        if (m == 1) sort(a, a + n, cmp1);
        else if (m == 2) sort(a, a + n, cmp2);
        else sort(a, a + n, cmp3);
        printf("Case %d:\n", cas++);
        for (int i = 0; i < n; ++i)
            printf("%s %s %d\n", a[i].id, a[i].name, a[i].score);
    }
    return 0;
}

易錯點

  1. strcmp 返回負/零/正分別對應小/等/大,直接用於比較函數返回值
  2. 次關鍵字比較僅在主關鍵字相等時觸發
  3. 輸出格式:Case %d: 獨佔一行,後接數據行

此題是 C++ sort 配合自定義比較器的標準練習,掌握多關鍵字比較邏輯即可輕鬆解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved