【PTA】乙级1015

本文介绍了一道涉及排序和数据结构的编程题目,通过创建stu类存储学生信息,并利用vector动态数组进行不同等级学生的分类。在处理过程中,使用了自定义排序函数cmp结合algorithm库中的sort函数,实现按总分、德育分和学号进行排序。在代码实现中,遇到数据规模限制问题,最终通过调整vector大小成功解决,实现了对四类学生信息的完整输出。
摘要由CSDN通过智能技术生成

题干

在这里插入图片描述
在这里插入图片描述

输入样例

14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60

输出样例

12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90

想法

初次看到这一题时,感觉信息量很大,排序方式很复杂(本人菜鸡)。但也是有些想法的,首先,可以创建一个学生类,来存储这些信息。然后利用vector自定义四个动态数组,对应四个等级的学生,方便排序。最后就是排序了,很自然想到algorithm头文件中的sort排序算法,但是我们在使用之前需要定义一下排序办法,也就是sort函数中的第三个参数。以上便是求解这个问题的核心想法。具体细节和发现的有意思的东西在代码中。

CODE

#include<bits/stdc++.h>
using namespace std;
class stu
{
    public:
    stu(string m_number,int m_de,int m_cai)
    {
        this->number=m_number;
        this->de=m_de;
        this->cai=m_cai;
    }
    bool operator()( stu &studata1, stu &studata2)
    {
        int sum1=studata1.de+studata1.cai,sum2=studata2.de+studata2.cai;
    
        if(sum1>sum2)
        {
            return true;
        }
        if(sum1<sum2)
        {
            return false;
        }
        if(sum1==sum2)
        {
            if(studata1.de>studata2.de)
            {
                return true;
            }
            if(studata1.de<studata2.de)
            {
                return false;
            }
            if(studata1.de==studata2.de)
            {
                if(studata1.number<studata2.number)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

        }
    }
    string number;
    int de;
    int cai;
};
bool cmp(stu &studata1,stu &studata2)
{
    int sum1=studata1.de+studata1.cai,sum2=studata2.de+studata2.cai;
    
        if(sum1>sum2)
        {
            return true;
        }
        if(sum1<sum2)
        {
            return false;
        }
        if(sum1==sum2)
        {
            if(studata1.de>studata2.de)
            {
                return true;
            }
            if(studata1.de<studata2.de)
            {
                return false;
            }
            if(studata1.de==studata2.de)
            {
                if(studata1.number<studata2.number)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

        }
    
}
int main()
{
    int n,jige,youxiu;
    cin>>n>>jige>>youxiu;
    vector<stu>stu_data1,stu_data2,stu_data3,stu_data4;
    // stu stu_data1[10000];
    // stu stu_data2[10000];
    // stu stu_data3[10000];
    // stu stu_data4[10000];
    int num=0;
    int t1=0,t2=0,t3=0,t4=0;
    for(int i=0;i<n;i++)
    {
        int de,cai;
        string number;
        cin>>number>>de>>cai;
        stu temp(number,de,cai);
        if(de>=jige&&cai>=jige)
        {
            num++;
            if(de>=youxiu&&cai>=youxiu)
            {
                // stu_data1[t1].de=de;
                // stu_data1[t1].cai=cai;
                stu_data1.push_back(temp);
                // stu_data1[t1].number=number;
                t1++;
                continue;  
            }
            if(de>=youxiu&&cai>=jige)
            {
                // stu_data2[t2].de=de;
                // stu_data2[t2].cai=cai;
                // stu_data2[t2].number=number;
                stu_data2.push_back(temp);
                t2++;
                continue;  
            }
            if(de>=jige&&cai>=jige&&de>=cai)
            {
                // stu_data3[t3].de=de;
                // stu_data3[t3].cai=cai;
                // stu_data3[t3].number=number;
                stu_data3.push_back(temp);
                t3++;
                continue;  
            }
                // stu_data4[t4].de=de;
                // stu_data4[t4].cai=cai;
                // stu_data4[t4].number=number;
                stu_data4.push_back(temp);
                t4++;  
        }
    }
    cout<<num<<endl;
    if(t1!=0)
    {
        sort(stu_data1.begin(),stu_data1.end(),cmp);
        for(int i=0;i<t1;i++)
        {
            cout<<stu_data1[i].number<<" "<<stu_data1[i].de<<" "<<stu_data1[i].cai<<endl;;
        }
    }

    if(t2!=0)
    {
        sort(stu_data2.begin(),stu_data2.end(),cmp);
        for(int i=0;i<t2;i++)
        {
            cout<<stu_data2[i].number<<" "<<stu_data2[i].de<<" "<<stu_data2[i].cai<<endl;;
        }
    }

    if(t3!=0)
    {
        sort(stu_data3.begin(),stu_data3.end(),cmp);
        for(int i=0;i<t3;i++)
        {
            cout<<stu_data3[i].number<<" "<<stu_data3[i].de<<" "<<stu_data3[i].cai<<endl;;
        }
    }
    if(t4!=0)
    {
        sort(stu_data4.begin(),stu_data4.end(),cmp);
        for(int i=0;i<t4;i++)
        {
            cout<<stu_data4[i].number<<" "<<stu_data4[i].de<<" "<<stu_data4[i].cai<<endl;;
        }
    }

    return 0;
}

在这里插入图片描述

小插曲

我最开始并没有想到使用动态数组,而是事先规定好大小,然而提交了几次总是会出现段错误,当我把四个数组大小改到10w的时候,发现全部测试点都段错误。试着试着改到5w的时候刚刚好,这说明测试的数据并没有变态到某个等级有十万个,也是侥幸AC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值