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;
}

posted @ 2020-09-30 01:02  韩天尊  阅读(105)  评论(0)    收藏  举报