PAT (Basic Level) 1073 多选题常见计分法(恶心模拟)
生活随笔
收集整理的這篇文章主要介紹了
PAT (Basic Level) 1073 多选题常见计分法(恶心模拟)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:1058的升級版,批改多選題,全對得滿分,半對的半分,有錯誤選項不得分,最后統(tǒng)計出每個學(xué)生的成績,以及哪個題目的哪個選項錯誤的次數(shù)最多,若有并列,依次輸出
題目分析:目前為止pat里最惡心的模擬題,沒有之一,并且這個題目不知道是不是有一個很奇怪的測試點把我卡了,網(wǎng)上去找題解也沒找到關(guān)于那個測試點的描述,在努力了一個下午加一個晚上之后選擇放棄(nmd,為了追求完美浪費了那么多時間,這什么破題?)因為熟練的運用stl,所以這個題目的實現(xiàn)并不是那么麻煩,但就是得不了滿分,不知道為什么
需要注意的就是,錯誤選項有兩個概念:
我們都需要統(tǒng)計次數(shù)
直接掛代碼吧,懶得做了,18分的菜雞代碼:
#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=110;int mark[N];//分?jǐn)?shù) 格式:mark[題號]=分?jǐn)?shù) unordered_map<string,bool>mp[N];//正確答案 格式:mp[題號][答案]=是否存在 unordered_map<char,bool>mmp[N];//正確答案 格式:mmp[題號][每一個正確選項]=是否存在 int cnt[N][150]={0};//錯題選項 格式:cnt[題號][選項]=個數(shù) (選項我是用ASCII碼來儲存的) double ans[N*10]={0};//分?jǐn)?shù) 格式:ans[學(xué)生序號]=分?jǐn)?shù)int main() { // freopen("input.txt","r",stdin);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int num;scanf("%d%*d%d",mark+i,&num);char ch[5];string s;for(int j=0;j<num;j++){scanf("%s",ch);s+=ch[0];mmp[i][ch[0]]=true; }mp[i][s]=true;}getchar();//注意!!!在cin或scanf與getline或gets連用時,已經(jīng)記住要用getchar吃掉回車for(int i=1;i<=n;i++){string s;getline(cin,s);//直接讀一行,即當(dāng)前學(xué)生的所有答案for(int i=0;i<s.size();i++)//去掉所有的括號if(s[i]=='('||s[i]==')')s.erase(s.begin()+i);stringstream ss(s);int num;char ch[5];int pos=1;//題號 while(ss>>num){unordered_map<char,bool>mpmp;//記錄學(xué)生選了哪些選項mpmp.clear(); string res;bool flag=true;//是否有錯誤選項存在 while(num--){ss>>ch;res+=ch[0];mpmp[ch[0]]=true;if(!mmp[pos][ch[0]])//如果有錯誤選項 {flag=false;cnt[pos][ch[0]]++;//記錄選錯的編號 }}if(!flag)//有錯誤選項,記錄一下有哪些正確選項沒有選上 {string temp;//本個題目的正確答案 for(auto it=mp[pos].begin();it!=mp[pos].end();it++)temp=it->first;for(int j=0;j<temp.size();j++)//遍歷一遍正確答案,看一看該學(xué)生少了哪些答案 {if(!mpmp[temp[j]])cnt[pos][temp[j]]++;//記錄錯誤選項的次數(shù) }}else//沒有錯誤選項 {if(mp[pos][res])//全對得全分 ans[i]+=mark[pos];else//半對的一半分{ans[i]+=double(mark[pos])*0.5;string temp;//本個題目的正確答案 for(auto it=mp[pos].begin();it!=mp[pos].end();it++)temp=it->first;for(int j=0;j<temp.size();j++)//遍歷一遍正確答案,看一看該學(xué)生少了哪些答案 {if(!mpmp[temp[j]])cnt[pos][temp[j]]++;//記錄錯誤選項的次數(shù) }} } pos++;}}for(int i=1;i<=n;i++)printf("%.1f\n",ans[i]);int mmax=0;//記錄最多的錯誤選項個數(shù) for(int i=1;i<=m;i++)for(int j='a';j<='e';j++)mmax=max(mmax,cnt[i][j]);if(mmax==0)//沒有錯題 cout<<"Too simple"<<endl;else{for(int i=1;i<=m;i++)//遍歷所有的題目{for(int j='a';j<='e';j++){if(cnt[i][j]==mmax)printf("%d %d-%c\n",mmax,i,j);}} }return 0; }?
總結(jié)
以上是生活随笔為你收集整理的PAT (Basic Level) 1073 多选题常见计分法(恶心模拟)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT (Basic Level) 10
- 下一篇: PAT (Basic Level) 10