7-41 PAT排名汇总 (25 分)多样排序
生活随笔
收集整理的這篇文章主要介紹了
7-41 PAT排名汇总 (25 分)多样排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原題:https://pintia.cn/problem-sets/15/problems/888
思路:
創(chuàng)建一個結(jié)構(gòu)體,里面包含每個考生的各種信息:姓名,成績,分區(qū)排名,最終排名,地區(qū)
struct stu {string name;int score,place,Sum_rank,zone_rank; }List[MAXSIZE];排序分成三步:
第一步,對分區(qū)學生按照成績高低進行排名,同時將排名記錄進該考試信息中;
第二步,對所有考生按照成績高低進行排名,同時將排名記錄進該考試信息中;
第三步,對所有考生按照總地區(qū)的排名進行排序,如果出現(xiàn)并列的則按小學號排序;
完成第三步之后直接按順序輸出即可;
#include<iostream> #include<algorithm> #include<string> #define MAXSIZE 30010 using namespace std; struct stu {string name;int score,place,Sum_rank,zone_rank; }List[MAXSIZE]; bool cmp(stu a, stu b) { return a.score > b.score; } bool cmp1(stu a, stu b) {return a.Sum_rank != b.Sum_rank ? a.Sum_rank < b.Sum_rank : a.name < b.name; } int main() {int n, cnt = 0;scanf("%d", &n);for (int i = 1; i <= n; i++){int k;struct stu stus[300];scanf("%d", &k);for (int j = 0; j < k; j++){cin >> stus[j].name>>stus[j].score;stus[j].place = i; }sort(stus, stus + k, cmp);//開始處理分區(qū)排名,并且處理并列的那些排名for (int j = 0; j < k; j++){int p = j;if (stus[j - 1].score == stus[j].score && j >= 1) {while (stus[p - 1].score == stus[p].score && p >= 1)p--;}stus[j].zone_rank = p + 1;List[cnt++] = stus[j];//存儲到總表之中}}sort(List, List + cnt,cmp);//對總表進行排名,并且處理并列的排名for (int j = 0; j < cnt; j++){int p = j;if (List[j - 1].score == List[j].score && j >= 1) {while (List[p - 1].score == List[p].score && p >= 1)p--;}List[j].Sum_rank = p+1;}sort(List, List + cnt, cmp1);cout << cnt << endl;for (int i = 0; i < cnt; i++){cout << List[i].name << " " << List[i].Sum_rank << " " << List[i].place << " " << List[i].zone_rank << endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的7-41 PAT排名汇总 (25 分)多样排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好酷的文章
- 下一篇: 重“薪”定义世界,智能物联网+区块链新学