PAT甲级1012 The Best Rank :[C++题解]4个成绩取排名最低:排序、二分(好题)
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1012 The Best Rank :[C++题解]4个成绩取排名最低:排序、二分(好题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
遇到的問題:信息存在結構體(?)中,然后排名呢?需要分別對 C、M、E、A排四次嗎?
這里成績的存儲 用二維數組 vector<int> q[4]; 每一行分別表示A、C、M、E四個門類的成績。
然后使用哈希表進行映射 unordered_map<string ,vector<int>> grades; 第一維是 學號, 第二維是一個二維vector,存儲這個學生的各科成績。
同時,由于同一門類的成績位于 一個一維數組(二維數組中的一行,即一維數組)中,可以分別進行排序!!!!
然后對于學號查詢,返回其4個門類成績排名的最小值即可。
ac代碼
從小到大排序的寫法。二分出來最后一個大于等于x的下標,不是二分出來第一個大于等于x的下標。
如果采用從大到小排序,則需要二分出來第一個大于等于x的下標
//對四個門類的成績進行排序 從大到小排for(int i=0;i<4;i++) sort(q[i].begin(),q[i].end(),greater<int>());int getRank(int x,vector<int> a){int l =0 ,r = a.size()-1;//從大到小排列,找第一個大于等于的while(l<r){int mid =l+r >>1;if(a[mid]<=x) r= mid;else l =mid+1;}return r+1; } #include<bits/stdc++.h> using namespace std;vector<int> q[4]; //二維數組中q[0]存每個學生的A,q[1]存C,q[2]存M,q[3]存E unordered_map<string,vector<int>> grades;int getRank(int x,vector<int> a){int l =0 ,r = a.size()-1;//這里是倒序排隊//需要二分出來最后一個 84,88,88,90,94 找88,下標是2,而不是1while(l<r){int mid =l+r+1 >>1;if(a[mid]<=x) l=mid;else r =mid-1;}return a.size()-r; }int main(){int n ,m;cin>>n>>m;for(int i=0;i<n;i++){string id;int t[4]={0};cin>>id;for(int i=1;i<4;i++){cin>>t[i]; t[0]+=t[i];}t[0]=round(t[0]/3.0); //平均分取整for(int j=0;j<4;j++){q[j].push_back(t[j]); //成績存入成績數組中grades[id].push_back(t[j]);//成績錄入hash table}}//對四個門類的成績進行排序:從小到大for(int i=0;i<4;i++) sort(q[i].begin(),q[i].end());while(m--){string id;cin>>id;char name[] ="ACME";if(grades.count(id)==0) cout<<"N/A"<<endl;else{//查成績int res =10000; //排名char c; //類別for(int i=0;i<4;i++){int rank = getRank(grades[id][i],q[i]); //傳入一個學生的成績,和該門類成績數組// cout<<rank<<endl;if(rank<res){res =rank;c =name[i];}}cout<< res<<" "<<c<<endl;}} }題目鏈接
PAT甲級1012 The Best Rank
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的PAT甲级1012 The Best Rank :[C++题解]4个成绩取排名最低:排序、二分(好题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1019 General Pa
- 下一篇: PAT甲级1022 Digital Li