日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PAT (Basic Level) 1095 解码PAT准考证(模拟+stl,好题)

發布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT (Basic Level) 1095 解码PAT准考证(模拟+stl,好题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出n個學生的準考證號以及成績,再給出m個查詢,要求按照規則輸出每一個查詢

首先,準考證的構成也是有講究的,每個準考證號由四部分組成:

  • 第一位是級別,A代表甲級,B代表乙級,T代表頂級
  • 第 2~4 位是考場編號,范圍從 101 到 999;
  • 第 5~10 位是考試日期,格式為年、月、日順次各占 2 位;
  • 最后 11~13 位是考生編號,范圍從 000 到 999。
  • 每次查詢分為三種情況:類型+操作數

  • 類型為1:操作數的含義為級別(A、B、T),要求首先按照成績不嚴格降序,其次按照準考證升序輸出指定級別的學生
  • 類型為2:操作數的含義為考場號,輸出該考場有多少個學生+該考場所有學生的總分數
  • 類型為3:操作數的含義為考試日期,輸出在該日期下的所有考場有多少學生,要求首先按照考場人數不嚴格降序,其次按照考場編號升序輸出
  • 若查詢的目標為空,輸出NA

    題目分析:模擬即可,簡單說一下思路:

  • 對于操作1,我們用vector+pair輔助記錄,在輸入完后提前排好序,后續就能O(size)查詢了
  • 對于操作2,我們用pair輔助記錄,在查詢時就能直接O(1)查詢
  • 對于操作3,我們用map套map記錄,外層記錄日期,內層記錄考場,這樣等處理時,開一個vector把第二層map扔進去,排個序再輸出就好了
  • 直接看代碼比較明了,注釋寫的很詳細了

    這里說一下我一開始被卡的一個小細節吧,一開始有兩個樣例過不去,后來比這網上別人的樣例一一對照,發現日期可能有前導零,所以在輸出的時候記得寫成%06d才行

    代碼:

    #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;vector<pair<string,int>>ans1[3];//類型1 A:0,B:1,T:2 ans1[type][pos]=<學號,分數>bool cmp1(pair<string,int> a,pair<string,int> b)//對操作1進行排序 {if(a.second!=b.second)return a.second>b.second;return a.first<b.first; }void type_1(string s,int val)//對操作1進行儲存 {char ch=s[0];int pos;if(ch=='A')pos=0;else if(ch=='B')pos=1;elsepos=2;ans1[pos].push_back(make_pair(s,val)); }pair<int,int>ans2[N];//類型2 ans2[考場]=人數:分數 void type_2(string s,int score)//對操作2進行儲存 {int pos=stoi(s.substr(1,3));ans2[pos].first++;ans2[pos].second+=score; }unordered_map<int,unordered_map<int,int>>ans3;//類型3 ans3[日期][考場]=人數bool cmp3(pair<int,int> a,pair<int,int> b)//對操作3進行排序 {if(a.second!=b.second)return a.second>b.second;return a.first<b.first; } void type_3(string s,int score)//對操作3進行儲存 {int pos=stoi(s.substr(4,6));int temp=stoi(s.substr(1,3));ans3[pos][temp]++; }int main() { // freopen("input.txt","r",stdin);int n,m;scanf("%d%d",&n,&m);while(n--){string s;int score;cin>>s>>score;type_1(s,score);type_2(s,score);type_3(s,score);}for(int i=0;i<3;i++)//預處理一下操作1的排序,后續就能對操作1 O(size)查詢了sort(ans1[i].begin(),ans1[i].end(),cmp1);for(int i=1;i<=m;i++){int op;scanf("%d",&op);if(op==1){char ch[5];scanf("%s",ch);printf("Case %d: %d %c\n",i,op,ch[0]);int pos;if(ch[0]=='A')pos=0;else if(ch[0]=='B')pos=1;elsepos=2;if(ans1[pos].size()){for(int j=0;j<ans1[pos].size();j++)printf("%s %d\n",ans1[pos][j].first.c_str(),ans1[pos][j].second);}elseprintf("NA\n");}else if(op==2){int num;scanf("%d",&num);printf("Case %d: %d %d\n",i,op,num);if(ans2[num].first)printf("%d %d\n",ans2[num].first,ans2[num].second);elseprintf("NA\n");}else{int num;scanf("%d",&num);printf("Case %d: %d %06d\n",i,op,num);//注意%06dif(ans3[num].empty())printf("NA\n");else{vector<pair<int,int>>ans;copy(ans3[num].begin(),ans3[num].end(),back_inserter(ans));sort(ans.begin(),ans.end(),cmp3);for(int j=0;j<ans.size();j++)printf("%d %d\n",ans[j].first,ans[j].second);}}}return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的PAT (Basic Level) 1095 解码PAT准考证(模拟+stl,好题)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。