1073 多选题常见计分法 (20 分)
程序员文章站
2024-03-22 00:01:58
...
1073 多选题常见计分法 (20 分)
【我的代码】
1// 1073 多选题常见计分法 (20 分)
2#include <iostream>
3#include <string.h>
4using namespace std;
5struct Timu{
6 double mark;
7 int nc;
8 int ny;
9 int ncount[5] = {0}; //用于记录每个选项错误次数
10 int pd[5] = { 0 };
11}s[101];
12double judge(int a[5], int b[5], int k){
13 int count = 0;
14 int yn = 0; //0为答对,1为答错
15 for(int i = 0; i < s[k].nc; i++){
16 if(b[i] && a[i]){ //如果输入为正确,正确计数器++
17 count++;
18 }
19 else if (a[i] && !b[i]) { //没有输入的正确选项
20 s[k].ncount[i]++;
21 }
22 else if (!a[i] && b[i]) { //输入了一个错误的选项
23 s[k].ncount[i]++;
24 yn = 1;
25 }
26 }
27 if(yn) return 0;
28 else if(count != s[k].ny) return s[k].mark/2;
29 else if(count == s[k].ny) return s[k].mark;
30}
31int main(){
32 int N, M;//学生人数和多选题个数
33 cin>>N>>M;
34 double sum;
35 char ch;
36 int t[5]; //用t记录输入的选项
37 //遍历题目
38 for(int i = 0; i < M; i++){
39 cin>>s[i].mark>>s[i].nc>>s[i].ny;
40 for(int j = 0; j < s[i].ny;j++){
41 cin>>ch;
42 s[i].pd[ch - 'a'] = 1;
43 }
44 }
45 //遍历学生
46 int k;
47 for(int i = 0;i < N; i++){
48 sum = 0;
49 for(int j = 0; j < M; j++){
50 cin>>ch>>k;
51 memset(t, 0, sizeof(t)); //重置为0
52 for(int z = 0; z < k; z++){
53 cin>>ch;
54 t[ch - 'a']++;
55 }
56 //判断得分与比对答案
57 sum += judge(s[j].pd, t, j);
58 cin>>ch;
59 }
60 printf("%0.1lf\n", sum);
61 }
62 int max = 0;
63 for(int i = 0; i < M; i++){
64 for(int j = 0;j < s[i].nc; j++){
65 max = s[i].ncount[j] > max ? s[i].ncount[j] : max;
66 }
67 }
68 if(max){
69 for(int i = 0; i < M; i++){
70 for(int j = 0; j < s[i].nc; j++){
71 if(s[i].ncount[j] == max){
72 cout<<max<<" "<<i+1<<"-"<<(char) (j+'a')<<endl;
73 }
74 }
75 }
76 }
77 else{
78 cout<<"Too simple";
79 }
80 return 0;
81}
【总结】
这题目跟前面有一题很类似,同样需要建立题目的结构体。
上一篇: Android 之 基于Xposed原理热修复详解
下一篇: 测试开发进阶(四十三)