1073 多选题常见计分法 (20 分)
【我的代码】
// 1073 多选题常见计分法 (20 分)
#include <iostream>
#include <string.h>
using namespace std;
struct Timu{
double mark;
int nc;
int ny;
int ncount[5] = {0}; //用于记录每个选项错误次数
int pd[5] = { 0 };
}s[101];
double judge(int a[5], int b[5], int k){
int count = 0;
int yn = 0; //0为答对,1为答错
for(int i = 0; i < s[k].nc; i++){
if(b[i] && a[i]){ //如果输入为正确,正确计数器++
count++;
}
else if (a[i] && !b[i]) { //没有输入的正确选项
s[k].ncount[i]++;
}
else if (!a[i] && b[i]) { //输入了一个错误的选项
s[k].ncount[i]++;
yn = 1;
}
}
if(yn) return 0;
else if(count != s[k].ny) return s[k].mark/2;
else if(count == s[k].ny) return s[k].mark;
}
int main(){
int N, M;//学生人数和多选题个数
cin>>N>>M;
double sum;
char ch;
int t[5]; //用t记录输入的选项
//遍历题目
for(int i = 0; i < M; i++){
cin>>s[i].mark>>s[i].nc>>s[i].ny;
for(int j = 0; j < s[i].ny;j++){
cin>>ch;
s[i].pd[ch - 'a'] = 1;
}
}
//遍历学生
int k;
for(int i = 0;i < N; i++){
sum = 0;
for(int j = 0; j < M; j++){
cin>>ch>>k;
memset(t, 0, sizeof(t)); //重置为0
for(int z = 0; z < k; z++){
cin>>ch;
t[ch - 'a']++;
}
//判断得分与比对答案
sum += judge(s[j].pd, t, j);
cin>>ch;
}
printf("%0.1lf\n", sum);
}
int max = 0;
for(int i = 0; i < M; i++){
for(int j = 0;j < s[i].nc; j++){
max = s[i].ncount[j] > max ? s[i].ncount[j] : max;
}
}
if(max){
for(int i = 0; i < M; i++){
for(int j = 0; j < s[i].nc; j++){
if(s[i].ncount[j] == max){
cout<<max<<" "<<i+1<<"-"<<(char) (j+'a')<<endl;
}
}
}
}
else{
cout<<"Too simple";
}
return 0;
}
【总结】
这题目跟前面有一题很类似,同样需要建立题目的结构体。