PAT乙级1073 多选题常见计分法 (20 分)
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT乙级1073 多选题常见计分法 (20 分)相关的知识,希望对你有一定的参考价值。
#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
struct node//题
{
int score; //发数
int sum;//总选项个数
string ans;//答案
}Node[10005];
struct student//保存每一道题的正确性
{
int sum;//总的错误数
int s[7];//每道题的选项选错数
}Student[1005];
double score[10005];
int main(void)
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>Node[i].score>>Node[i].sum;
int t; cin>>t;
Node[i].ans="";
for(int j=0;j<t;j++)
{
string s; cin>>s;
Node[i].ans+=s;
}
}
string s; getline(cin,s);
for(int i=0;i<n;i++)//读入人数
{
getline(cin,s);
int index=0;
for(int k=0;k<m;k++)//读入选项
{
string temp;
while(s[index++]!=')')
{
if(s[index]>='a'&&s[index]<='z') temp+=s[index];
}
bool flag=false;
int cnt=0;
for(int j=0;j<6;j++)
{
if(temp.find('a'+j)==-1&&Node[k].ans.find('a'+j)==-1) continue;//都没有
if(temp.find('a'+j)!=-1&&Node[k].ans.find('a'+j)!=-1) cnt++;//都有
if(temp.find('a'+j)==-1&&Node[k].ans.find('a'+j)!=-1) Student[k].s[j]++;//漏选
if(temp.find('a'+j)!=-1&&Node[k].ans.find('a'+j)==-1) Student[k].s[j]++,flag=true;//选错
}
if(!flag&&cnt==Node[k].ans.size()) score[i]+=Node[k].score;
if(!flag&&cnt!=Node[k].ans.size()) score[i]+=Node[k].score/2.0;
}
}
for(int i=0;i<n;i++) printf("%.1lf\\n",score[i]);
int index=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<6;j++) index=max(index,Student[i].s[j]);
}
if(index==0) cout<<"Too simple"<<endl;
else
{
for(int i=0;i<m;i++)
{
for(int j=0;j<6;j++)
if(Student[i].s[j]==index)
{
printf("%d %d-%c\\n",index,i+1,'a'+j);
}
}
}
return 0;
}
以上是关于PAT乙级1073 多选题常见计分法 (20 分)的主要内容,如果未能解决你的问题,请参考以下文章