1058 選擇題 (20 分)
批改多選題是比較麻煩的事情,本題就請你寫個程式幫助老師批改多選題,并且指出哪道題錯的人最多,
輸入格式:
輸入在第一行給出兩個正整數 N(≤ 1000)和 M(≤ 100),分別是學生人數和多選題的個數,隨后 M 行,每行順次給出一道題的滿分值(不超過 5 的正整數)、選項個數(不少于 2 且不超過 5 的正整數)、正確選項個數(不超過選項個數的正整數)、所有正確選項,注意每題的選項從小寫英文字母 a 開始順次排列,各項間以 1 個空格分隔,最后 N 行,每行給出一個學生的答題情況,其每題答案格式為 (選中的選項個數 選項1 ……),按題目順序給出,注意:題目保證學生的答題情況是合法的,即不存在選中的選項數超過實際選項數的情況,
輸出格式:
按照輸入的順序給出每個學生的得分,每個分數占一行,注意判題時只有選擇全部正確才能得到該題的分數,最后一行輸出錯得最多的題目的錯誤次數和編號(題目按照輸入的順序從 1 開始編號),如果有并列,則按編號遞增順序輸出,數字間用空格分隔,行首尾不得有多余空格,如果所有題目都沒有人錯,則在最后一行輸出 Too simple,
輸入樣例:
3 4
3 4 2 a c
2 5 1 b
5 3 2 b c
1 5 4 a b d e
(2 a c) (2 b d) (2 a c) (3 a b e)
(2 a c) (1 b) (2 a b) (4 a b d e)
(2 b d) (1 e) (2 b c) (4 a b c d)
輸出樣例:
3
6
5
2 2 3 4
思路
整體上用到了STL庫里的map結構,實作了int型別到string型別的映射,即,每一個題號對應一套正確選項,
具體的操作先是對回圈遍歷操作map實作各個題正確答案的存入,然后再申請一個新的map來存學生選項,再進行對比,為了節省空間,學生選項再對比之后可以釋放來存放下一個學生選項,
在處理易錯題的時候申請一個int型別的陣列,一個題一個坑,每有錯的出現,就記錄并與最大值countmax進行比較,在輸出階段,回圈錯題統計陣列,輸出等于countmax的所有題號即可,
最后,記得當學生作答全部正確的時候輸出Too simple了,
例程
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<sstream>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int m,n,j,k;
char a;
string str;
int grade[1000];memset(grade,0,sizeof(grade));
int count [1001];memset(count,0,sizeof(count));
int countmax=0;
int max[1000];memset(max,0,sizeof(max));
int sum;
map<int,string> mp;
map<int,string> mp1;
while(cin>>n>>m)//n:ti ; m:ren
{
for(int i=0;i<m;i++)
{
cin>>grade[i]>>max[i]>>j;
mp[i]+='(';mp[i]+=(j+'0');
for(k=0;k<j;k++)
{
cin>>a;
mp[i]+=' ';
mp[i]+=a;
}mp[i]+=')';
}
getline(cin,str);
for(int i=0;i<n;i++)
{
getline(cin,str);k=0;
for(j=0;j<str.length();j++)
{
if(str[j]!=')')mp1[k]+=str[j];
else
{
mp1[k]+=str[j];
j++;k++;
}
}
//-----------------------
sum=0;
for(int ii=0;ii<m;ii++)
{
if(mp[ii]==mp1[ii])
{
sum+=grade[ii];
}else{
count[ii]++;
countmax=(countmax<count[ii])?count[ii]:countmax;
}
}
cout<<sum<<endl;mp1.clear();
}
if(countmax>0){
cout<<countmax;
for(int i=0;i<1001;i++)
if(countmax==count[i])
cout<<' '<<i+1;
}else cout<<"Too simple";
cout<<endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260409.html
標籤:其他
上一篇:關于memset 初始化陣列
下一篇:簡明圖解馮·諾依曼計算機體系
