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 分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1073. 多选题常见计分法

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

通过位运算来解决一些算法题

安全员考试多选题是怎么计分?

中级审计师考试多选题究竟如何计分?

初级会计实务多选题怎么计分