PAT乙级1073-----多选题常见计分法 (20分)

1073 多选题常见计分法 (20分)

思路:

1.错选的和未选的都计入错误信息

2.错误信息的输出应该是  MAX某道题某选项的错误次数+题号+选项

首次通过代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4
 5 typedef struct answer{
 6      int s_sum;
 7      int r_s_sum;
 8      int score;
 9      int w_sum;
10      int right_answer[6];
11      int wrong_answer[6];
12 }answer,*a;
13
14 int main(){
15 int student_sum;
16 int answer_sum;
17 scanf("%d %d",&student_sum,&answer_sum);
18 a answer_list[101]={NULL};
19 for(int i=0;i<answer_sum;i++){
20     a a1=(a)malloc(sizeof(answer));a1->w_sum=0;
21     for(int j=0;j<6;j++){
22         a1->right_answer[j]=0;
23         a1->wrong_answer[j]=0;
24     }
25     scanf("%d %d %d",&a1->score,&a1->s_sum,&a1->r_s_sum);
26      for(int j=0;j<a1->r_s_sum;j++){
27          char k[2];
28          scanf("%s",k);
29          a1->right_answer[k[0]-‘a‘]=1;
30      }
31      answer_list[i]=a1;
32 }
33 getchar();
34 int all_right=0;
35 for(int i=0;i<student_sum;i++){
36     char input[1000];double s_score=0;int flag=1;
37     gets(input);
38     int counter=0;int j=0;
39     while(1){
40         int k=input[j]-‘0‘;
41          if(k>=0&&k<=9) {
42             int c1=0,c2=0;int flag1=1;
43             while(1){
44                 int k=input[++j]-‘a‘;
45                 if(k>=0&&k<=9){
46                 if(answer_list[counter]->right_answer[k]==1) {
47                      c1++;
48                      answer_list[counter]->wrong_answer[k]++;
49                 }
50                 else {answer_list[counter]->wrong_answer[k]++;
51                      flag=0;
52                      if(flag1){
53                          flag1=0;
54                          answer_list[counter]->w_sum++;
55                      }
56                      c2++;}
57                 }
58                 else if(input[j]==‘)‘||input[j]==‘\0‘) break;
59             }
60             if(c1==answer_list[counter]->r_s_sum&&c2==0) s_score+=answer_list[counter]->score;
61             else if(c1<answer_list[counter]->r_s_sum&&c2==0) s_score+=0.5*(double)answer_list[counter]->score;
62             counter++;
63         }
64         if(counter==answer_sum||input[j]==‘\0‘)  break;
65         j++;
66     }
67     if(flag&&counter==answer_sum) all_right++;
68     printf("%.1lf\n",s_score);
69 }
70 if(all_right==student_sum) {
71     printf("Too simple");
72     return 0;
73 }
74 int max=0;
75 for(int i=0;i<answer_sum;i++)
76     for(int j=0;j<6;j++){
77         if(answer_list[i]->right_answer[j]==1&&student_sum-answer_list[i]->wrong_answer[j]>max)
78         max=student_sum-answer_list[i]->wrong_answer[j];
79         else if(answer_list[i]->right_answer[j]==0&&answer_list[i]->wrong_answer[j]>max)
80         max=answer_list[i]->wrong_answer[j];
81     }
82 for(int i=0;i<answer_sum;i++){
83     for(int j=0;j<6;j++){
84             if(answer_list[i]->right_answer[j]==1&&student_sum-answer_list[i]->wrong_answer[j]==max)
85             printf("%d %d-%c\n",max,i+1,j+‘a‘);
86             else if(answer_list[i]->right_answer[j]==0&&answer_list[i]->wrong_answer[j]==max)
87             printf("%d %d-%c\n",max,i+1,j+‘a‘);
88
89     }
90 }
91 return 0;
92 }

原文地址:https://www.cnblogs.com/a982961222/p/12391927.html

时间: 2024-08-16 21:44:37

PAT乙级1073-----多选题常见计分法 (20分)的相关文章

PAT 1073. 多选题常见计分法

PAT 1073. 多选题常见计分法 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到50%分数:如果考生选择了任何一个错误的选项,则不能得分.本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多. 输入格式: 输入在第一行给出两个正整数N(<=1000)和M(<=100),分别是学生人数和多选题的个数.随后M行,每行顺次给出一道题的满分值(不超过5的正整数).选项个数(不少于2且不超过

1073 多选题常见计分法 (20 分)

批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一个错误的选项,则不能得分.本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多. 输入格式: 输入在第一行给出两个正整数 N(≤1000)和 M(≤100),分别是学生人数和多选题的个数.随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数).选项个数(不少于 2 且不超过 5 的正整数).正确选

pat 1116 Come on! Let&#39;s C(20 分)

1116 Come on! Let's C(20 分) "Let's C" is a popular and fun programming contest hosted by the College of Computer Science and Technology, Zhejiang University. Since the idea of the contest is for fun, the award rules are funny as the following: 0

C++&#183;PAT乙级1003. 我要通过!(17/20)

/* 1003. 我要通过!(20) "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确",否则输出"答案错误". 得到"答案正确"的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符: 2. 任意形如 xPATx 的字符串都可以获得"答案正确",其中 x 或者是空字符串

PAT乙级-1037. 在霍格沃茨找零钱(20)

如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易."现在,给定哈利应付的价钱P和他实付的钱A,你的任务是写一个程序来计算他应该被找的零钱. 输入格式: 输入在1行中分别给出P和A,格式为"Galleon.Sickle.Knut",其间用1个空格分隔.这里Galleon是[0, 107]区间内的整数,Sickle是[0, 17)区间

PAT 乙级 1037 在霍格沃茨找零钱(20)C++版

1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易."现在,给定哈利应付的价钱P和他实付的钱A,你的任务是写一个程序来计算他应该被找的零钱. 输入格式: 输入在1行中分别给出P和A,

PAT乙级1008. 数组元素循环右移问题 (20)

一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100).M(M>=0):第2行输入N个整数,之间用空格分隔. 输出格式:在一行中输出循环右移M位以

PAT乙级 1020. 月饼 (25)(只得到23分)

1020. 月饼 (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18.15.10万吨,总售价分别为75.72.45亿元.如果市场的最大需求量只有2

PAT 乙级 1008 数组元素循环右移问题 (20) C++版

1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例