PAT甲级1025 PAT Ranking:[C++题解]排序、结构体、排名
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1025 PAT Ranking:[C++题解]排序、结构体、排名
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
一個區域排名和一個總排名。啟發我們每個同學的數據存兩份,一個存在區域數組中,另一個存在整體數組中。
有序列表中排名怎么求呢?
比如序列
思路如下:如果該數和它前面的數不一樣,則它的排名就是它前面的數的個數+1,比如98分排名第2;如果該數和它前面的數相等,該數的排名和前面數的排名一致,比如98分排名第2.
ac代碼
#include<bits/stdc++.h> using namespace std; const int N =110;struct Student{string id;int grade;int location_number ,local_rank ,final_rank;bool operator <(const Student& a) const{ //重載小于號,可以理解成滿足什么條件的人排到前面if(grade!=a.grade) return grade>a.grade; //成績高的排在前面return id<a.id; //若成績相等,則id小的排在前面} };vector<Student> grades[N];//區域成績,二維數組 vector<Student> all;//全國總成績int main(){int n;cin>>n;for(int i=1;i<=n;i++){ //遍歷每一個區域:編號從1到nint k;cin>>k; //區域人數while(k--){string id;int grade;cin>> id>>grade;grades[i].push_back({id, grade,i}); //區域i的學生壓入}auto & g=grades[i]; //引用sort(g.begin(),g.end()); //區域排序for(int m=0;m<g.size();m++){ //區域排名if(!m || g[m].grade!=g[m-1].grade) //如果是第一個 或者是和前面的人成績不一樣g[m].local_rank=m+1;else g[m].local_rank = g[m-1].local_rank;all.push_back(g[m]); //區域排好名后壓入全國數組中}}sort(all.begin(),all.end()); //全國排序for(int i=0;i<all.size();i++){ //全國排名if(!i || all[i].grade!=all[i-1].grade)all[i].final_rank=i+1;else all[i].final_rank=all[i-1].final_rank;}cout<<all.size()<<endl;for(auto& s:all)cout<<s.id<<" "<<s.final_rank<<" "<<s.location_number<<" "<<s.local_rank<<endl; }第二遍代碼
沒用引用,寫起來使用二維數組。
題目鏈接
PAT甲級1025 PAT Ranking
總結
以上是生活随笔為你收集整理的PAT甲级1025 PAT Ranking:[C++题解]排序、结构体、排名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1022 Digital Li
- 下一篇: PAT甲级1028 List Sorti