1025 PAT Ranking (25 分)(分組結構體排序)
阿新 • • 發佈:2018-11-02
題目簡單,但是自己暴露了不少小問題。
有一個語法錯誤好坑,卡了好久。
for(int j = 0; j<k; j++){
cin >> arr[++sum].id >> arr[sum].score;
arr[sum].local = i;
}
cin雖然是從前往後讀的單竟然不是從前往後執行的,找這個錯誤找了好久。
自己最開始竟然忘記了集合裡的元素不能直接修改。
還有在結構體內部過載一定要加const。題目根本水的不行,就是自己各種小錯誤。先練幾個題找找手感,馬上就得系統複習語法了。
#include <cstdio> #include <iostream> #include <set> #include <stack> #include <algorithm> #include <string> #include <cstring> using namespace std; struct stu{ string id; int score; int rank; int local; int local_rank; stu(string _id = "", int _score = 0, int _rank = 0, int _local = 0, int _local_rank = 0) : id(_id), score(_score), rank(_rank), local(_local), local_rank(_local_rank){ }; bool operator < (const stu &b) const { if (score != b.score) return score > b.score; else return id < b.id; } }; stu arr[50000]; stack<stu> local[200]; int sum = -1; int n, k; int main() { cin >> n; for (int i = 1; i<=n; i++){ cin >> k; for(int j = 0; j<k; j++){ cin >> arr[sum].id >> arr[++sum].score; arr[sum].local = i; } } sort(arr, arr+sum+1); for (int i = 0; i<=sum; i++){ if (i == 0){ arr[i].rank = 1; arr[i].local_rank = 1; local[arr[i].local].push(arr[i]); continue; } if (arr[i].score == arr[i-1].score){ arr[i].rank = arr[i-1].rank; } else arr[i].rank = i+1; if (local[arr[i].local].empty()){ arr[i].local_rank = 1; local[arr[i].local].push(arr[i]); }else{ if (arr[i].score == local[arr[i].local].top().score){ arr[i].local_rank = local[arr[i].local].top().local_rank; local[arr[i].local].push(arr[i]); }else{ arr[i].local_rank = local[arr[i].local].size()+1; local[arr[i].local].push(arr[i]); } } } cout << sum+1 << endl; for (int i = 0; i<=sum; i++){ cout << arr[i].id << ' ' << arr[i].rank << ' ' << arr[i].local << ' ' << arr[i].local_rank << endl; } return 0; }