1058. 选择题(20)
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
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; struct stu { int max_score; int choice_num; int correct_choice_num; int correct_choice[5]; int check_num; int wrong_num; }; int stu_score[1001]; int main() { memset(stu_score,0,sizeof(stu_score)); int max_id=0; int n,m; cin>>n>>m; stu ques[101]; int count=0; int wrong_flag=0; for(int i=0;i<m;i++) { cin>>ques[i].max_score>>ques[i].choice_num>>ques[i].correct_choice_num; int j=ques[i].correct_choice_num; memset(ques[i].correct_choice,0,sizeof(ques[i].correct_choice)); while(j--) { char c; scanf(" %c",&c); ques[i].correct_choice[c-'a']=1; } ques[i].wrong_num=0; ques[i].check_num=0; } for(int i=0;i<n;i++) { stu_score[i]=0; for(int j=0;j<m;j++) { char c; scanf(" %c",&c);//去掉左括号 int stu_ans_num; scanf("%d",&stu_ans_num); char stu_choice[5]; for(int k=0;k<stu_ans_num;k++) { scanf(" %c",&stu_choice[k]); } //去掉右括号 scanf(" %c",&c); if(stu_ans_num!=ques[j].correct_choice_num) { wrong_flag=1; ques[j].wrong_num++; if(ques[max_id].wrong_num<ques[j].wrong_num) { max_id=j; } } else { for(int k=0;k<stu_ans_num;k++) { if(ques[j].correct_choice[stu_choice[k]-'a']==1) { if(k==stu_ans_num-1) { stu_score[i]+=ques[j].max_score; } } else { wrong_flag=1; ques[j].wrong_num++; if(ques[max_id].wrong_num<ques[j].wrong_num) { max_id=j; } break; } } } } } //输出最后的结果 for(int i=0;i<n;i++) { printf("%d\n",stu_score[i]); } if(wrong_flag==0) { printf("Too simple\n"); } else { printf("%d",ques[max_id].wrong_num); for(int i=0;i<m;i++) { if(ques[i].wrong_num==ques[max_id].wrong_num) { printf(" %d",i+1); } } cout<<endl; } return 0; }
——来自 熊猫 [http://www.cnblogs.com/xiongmao-cpp/]