選択肢1058(20分)
複数の選択肢をマークすることは、より面倒なことで、この質問は、ヘルプ教師にプログラムを書くことを求められます複数の選択肢の質問をマークし、そしてどのようなほとんどの人に間違った質問を指摘しました。
入力フォーマット:
入力ギブ2つの正の整数N(≤1000)学生の数と複数の選択肢の質問の数、それぞれ、最初の行及びM(≤100)。続いて、M行は、各行が順次、(5以下の正の整数)の質問のうちのオプションの数値が与えられる(正の整数以上2以上5)、オプションの正しい数(オプションは超えません正の整数)、すべての適切なオプション。小文字から各質問のためのオプションは、順次配置を始めることに注意してください。中でもスペースで区切られています。最後のN行は、各学生が答えにケースを与えている、すべての質問形式(選択したオプションオプション1 ......の数)、順番に指定されたタイトルへの答え。注:タイトル学生はケースが正当なものである答えを確認し、選択されたオプションの数は、オプションの実際の数よりも、存在しません。
出力フォーマットは:
入力、各スコアに対して1つの行の順序に従って、各学生のスコアを与えられます。唯一の注意文質問のスコアを取得するために、すべての適切な質問を選択します。出力話題のほとんど間違ったエラーの数と(1から番号タイトル入力の順で)数の最後の行。並んであっ側場合は、次出力を昇順で番号を押してください。スペースで区切られた数字の間には、最初から最後までのラインは、余分なスペースを持っていないかもしれません。すべてのトピック誰も間違って、最後の行で、出力あまりにもシンプルであれば。
サンプル入力:
3. 4
。3. 4 2 AC
2 5 1 B
。5 BC 2 3
1 5 4 ABDE。
(AC 2)(2 BD)(AC 2)(ABE 3)
(AC 2)(B. 1)(AB&2) (ABDE 4)
(2 BD)(E. 1)(2 BC)(ABCD 4)
出力サンプル:
3
6
5
2 2 3 4
キーは、必要なすべてが配列に設定されている、我々は配列をループの代わりに、操作の値をより便利にすることができ、常に一歩とは思わないです
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
int main(){
int n,m,temp,k;
scanf("%d %d",&n,&m);
vector<set<char>> right(m);
vector<int> sum(m),wrongs(m);
//先输入正确的答案
for(int i=0;i<m;i++){
scanf("%d %d %d",&sum[i],&temp,&k);
for(int j=0;j<k;j++){
char c;
scanf(" %c",&c);
right[i].insert(c);
}
}
//再输入学生的答案,边输入边处理,要不然麻烦死
for(int i=0;i<n;i++){
int score = 0;
getchar();
for(int j=0;j<m;j++){
if(j!=0){
scanf(" ");
}
scanf("(%d",&k);
set<char> st;//存学生答案
char d;
for(int p=0;p<k;p++){
scanf(" %c",&d);
st.insert(d);
}
scanf(")");
if(st==right[j]){
score+=sum[j];
}else{
wrongs[j]++;
}
}
printf("%d\n",score);
}
//找到错误次数最多的题
int maxwrong=0;
for(int i=0;i<m;i++){
if(wrongs[i]>maxwrong){
maxwrong=wrongs[i];
}
}
if(maxwrong==0){
printf("Too simple");
}else{
printf("%d",maxwrong);
for(int i=0;i<m;i++){
if(wrongs[i]==maxwrong){
printf(" %d",i+1);
}
}
}
return 0;
}