PAT (Basic Level) 1095 解码PAT准考证(模拟+stl,好题)
生活随笔
收集整理的這篇文章主要介紹了
PAT (Basic Level) 1095 解码PAT准考证(模拟+stl,好题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出n個學生的準考證號以及成績,再給出m個查詢,要求按照規則輸出每一個查詢
首先,準考證的構成也是有講究的,每個準考證號由四部分組成:
每次查詢分為三種情況:類型+操作數
若查詢的目標為空,輸出NA
題目分析:模擬即可,簡單說一下思路:
直接看代碼比較明了,注釋寫的很詳細了
這里說一下我一開始被卡的一個小細節吧,一開始有兩個樣例過不去,后來比這網上別人的樣例一一對照,發現日期可能有前導零,所以在輸出的時候記得寫成%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,好题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT (Basic Level) 10
- 下一篇: CodeForces - 603C Li