- //#include <iostream>
- //#include <vector>
- //#include <algorithm>
- #include <bits/stdc++.h>
- using namespace std;
- // 定義檔案結構體
- struct File {
- int name;//檔案名稱
- int modified_time;//修改時間
- int type;//檔案類型
- int size;//檔案大小
- int original_index; // 紀錄初始索引,確保穩定排序
- };
- // 比較函數類別,用來根據指定屬性進行排序
- class FileComparator {
- private:
- int attribute;//屬性
- bool ascending;//排序順序
- public:
- FileComparator(int attr, bool asc) : attribute(attr), ascending(asc) {}//定義排序邏輯,根據傳入的屬性 (attribute) 和排序順序 (ascending) 進行比較
- bool operator()(const File a, const File b) {
- int valA, valB;
- // 根據屬性選擇比較值
- switch (attribute) {
- case 1: valA = a.name; valB = b.name; break;
- case 2: valA = a.modified_time; valB = b.modified_time; break;
- case 3: valA = a.type; valB = b.type; break;
- case 4: valA = a.size; valB = b.size; break;
- default: return false;
- }
- // 進行升序或降序比較
- if (valA != valB)
- return ascending ? (valA < valB) : (valA > valB);
- // 如果屬性值相同,按原始順序排序
- return a.original_index < b.original_index;
- }
- };
- int main() {
- int N, K;
- cin >> N >> K;
- vector<File> files(N);
- // 讀入檔案資料
- for (int i = 0; i < N; i++) {
- cin >> files[i].name >> files[i].modified_time >> files[i].type >> files[i].size;
- files[i].original_index = i;
- }
- vector<int> operations(K);
- // 讀入操作資料
- for (int i = 0; i < K; i++) {
- cin >> operations[i];
- }
- // 記錄每個屬性目前的升降序狀態,預設為升序
- vector<bool> ascending(5, true);
- // 按操作順序進行排序
- for (int op : operations) {
- // 依指定屬性排序
- sort(files.begin(), files.end(), FileComparator(op, ascending[op]));
- // 切換該屬性的升降序狀態
- ascending[op] = !ascending[op];
- }
- // 輸出結果
- for (const auto file : files) {
- cout << file.name << " " << file.modified_time << " " << file.type << " " << file.size << endl;
- }
- return 0;
- }
- /*
- 3 7
- 1 2 5 8
- 2 4 6 8
- 3 3 6 7
- 2 2 2 3 3 3 3
- */
複製代碼 -----------------------------------------------------------------
程式解說
結構體定義:
定義了一個 File 結構體,包含四個屬性(檔案名稱、修改時間、檔案類型、檔案大小)和初始索引 original_index,用來保持穩定排序。
比較器:
使用 FileComparator 類別定義排序邏輯,根據傳入的屬性 (attribute) 和排序順序 (ascending) 進行比較。
如果兩個檔案的指定屬性值相同,會依照初始順序比較(original_index)。
排序操作:
使用 std::sort 函數按照指定屬性進行排序,並在排序完成後切換該屬性的升降序狀態。
主要邏輯:
按輸入順序執行所有的排序操作。
每次操作後更新對應屬性的排序順序。
輸入與輸出:
程式會依照範例輸入進行排序,最後輸出最終排序後的檔案屬性資料。
範例輸入與輸出
輸入:
複製程式碼
5 3
5 10 1 50
1 20 3 30
3 15 2 40
2 25 1 20
4 5 2 10
1 3 3
輸出:
複製程式碼
2 25 1 20
5 10 1 50
3 15 2 40
4 5 2 10
1 20 3 30
重點特性
使用穩定排序來維持原始順序的穩定性。
動態切換升降序狀態,模擬使用者連續點擊的操作。
高效處理多屬性排序問題,適用於實際應用場景。 |