PAT(Basic Level) Practice : 1073 多选题常见计分法 (20分)
1073 多选题常见计分法 (20分)
两个比较坑的地方
1.漏选也算错误
2.按照选项错误的最多输出,而不是题目错误的最多,不要被样例误导了
要命,搞了近3个小时
代码
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;
#include<iomanip>
//精度
#include<cmath>
//round四舍五入取整
class project
{
public:
int grade;
int sum;
int right;
vector<char> answers;
};
bool findchar(char c,vector<char> chars)
{
bool flag=false;
for(int i=0;i<chars.size();i++)
{
if(c==chars[i])
{
flag=true;
break;
}
}
return flag;
}
double compute(project p,vector<char> a)
{
if(a.size()>p.answers.size())
{
return 0;
}else if(a.size()==p.answers.size()){
bool flag=true;
for(int i=0;i<a.size();i++)
{
if(a[i]!=p.answers[i])
{
flag=false;
break;
}
}
if(flag)
return p.grade;
else
return 0;
}else
{
bool flag=true;
for(int i=0;i<a.size();i++)
{
if(!findchar(a[i],p.answers))
{
flag=false;
break;
}
}
if(flag)
{
double half=p.grade;
half=half/2;
return half;
}else
{
return 0;
}
}
}
class project1
{
public:
int num;
vector<int> cou;
};
void compute1(project1 & p,vector<char> a,vector<char> right)
{
for(int i=0;i<a.size();i++)
{
if(!findchar(a[i],right))
p.cou[a[i]-'a']++;
}
//正确答案里面没出现的也算错误比如3题的(1,c),b算错
for(int i=0;i<right.size();i++)
{
if(!findchar(right[i],a))
p.cou[right[i]-'a']++;
}
}
int main()
{
int n,m;
cin>>n>>m;
vector<project> projects;
for(int i=0;i<m;i++)
{
int g,s,r;
cin>>g>>s>>r;
project t;
t.grade=g;t.sum=s;t.right=r;
vector<char> a;
for(int j=0;j<r;j++)
{
char temp;
cin>>temp;
a.push_back(temp);
}
t.answers=a;
projects.push_back(t);
}
vector<project1> res;
for(int i=0;i<m;i++)
{
project1 p;
p.num=0;
vector<int> t;
for(int j=0;j<projects[i].sum;j++)
{
t.push_back(0);
}
p.cou=t;
res.push_back(p);
}
string str;
getline(cin,str);
for(int i=0;i<n;i++)
{
getline(cin,str);
int count=0;
double sum_grade=0;
for(int j=0;j<str.size();j++)
{
if(str[j]=='(')
{
int temp=str[j+1]-'0';
vector <char> a1;
for(int k=0;k<temp;k++)
{
a1.push_back(str[j+3+k*2]);
}
double grade1=compute(projects[count],a1);
if(grade1==0)
{
res[count].num++;
}
/*cout<<"************"<<endl;
for(int k=0;k<a1.size();k++)
{
cout<<a1[k]<<" ";
}
cout<<"************"<<endl;*/
compute1(res[count],a1,projects[count].answers);
sum_grade+=grade1;
count++;
}
}
cout<<setiosflags(ios::fixed);
cout<<setprecision(1)<<sum_grade<<endl;
}
int max=0;
for(int i=0;i<res.size();i++)
{
for(int j=0;j<res[i].cou.size();j++)
{
if(max<res[i].cou[j])
max=res[i].cou[j];
}
}
if(max==0)
cout<<"Too simple"<<endl;
else{
for(int i=0;i<res.size();i++)
{
for(int j=0;j<res[i].cou.size();j++)
{
if(max==res[i].cou[j])
{
char cc='a'+j;
cout<<max<<" "<<i+1<<"-"<<cc<<endl;
}
}
}
}
return 0;
}