PAT乙级-1015

0、 重点

算法类#include <algorithm>sort()以及cmp()的使用
sort()是自带的排序函数,默认是升序,但是可以自写一个cmp(),并指定给sort()函数,实现更多样的排序方式。

1、题解

在这里插入图片描述
输入样例:

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

2、分析:

第一行输入指明了考生人数,择优分数线,最低分数线
其余行为考生信息准考证号,德分,才分
那么按照规定,按考生的德分和才分分为五类:

  • 德分和才分皆到择优分数线:A1类
  • 德分到择优分数线,才分稍逊:A2类
  • 德分和才分都低于择优分数线,但德分高于才分:A3类
  • 其他到达最低分数线的:A4类
  • 两门都没到最低分数线的:A5类(淘汰)

输出时首先输出到达最低分数线的人数(即A1~A4),随后输出这些人的信息,规律为:

  • 先输出A1类:该类中又按总分降序输出,相同则按德分降序输出,再相同按准考证号升序输出。
  • 再输出A2类:该类中排序同上
  • 再输出A3类:该类中排序同上
  • 再输出A4类,该类中排序同上

我们可以通过定义大小为4的数组,元素为vector来存储该类的学生信息,信息录入完毕再对4个vector进行排序,最后再输出即可。

我们将定义结构体:

struct node{
	int num,de,cai;
}

定义cmp()排序规则:

bool cmp(struct node a,struct node b){
    if((a.de+a.cai)!=(b.de+b.cai)) return (a.de+a.cai)>(b.de+b.cai);	//若总分不等,则按node总分降序
    if(a.de!=b.de) return a.de>b.de;		//若德分不等,则按node的德分降序
    return a.num<b.num;		//否则就按学号升序
}

3、代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct node
{
    int num, de, cai;
};

bool cmp(struct node a,struct node b){
    if((a.de+a.cai)!=(b.de+b.cai)) return (a.de+a.cai)>(b.de+b.cai);
    if(a.de!=b.de) return a.de>b.de;
    return a.num<b.num;
}

int main(int argc, char **argv)
{
    int n,low,high;
    scanf("%d %d %d",&n,&low,&high);
    vector<node> v[4];
    node temp;
    int total=n;
    for(int i=0;i<n;i++){
        scanf("%d %d %d",&temp.num,&temp.de,&temp.cai);
        if(temp.de<low || temp.cai<low) total--;	//这里就将A5类排除了
        else if(temp.de>=high && temp.cai>=high) v[0].push_back(temp);	//A1类
        else if(temp.de>=high && temp.cai<high) v[1].push_back(temp);	//A2类
        else if(temp.de<high && temp.cai<high && temp.de>=temp.cai) v[2].push_back(temp);  //A3类
        else v[3].push_back(temp);	//A4类
    }
    printf("%d\n",total);
    for(int i=0;i<4;i++){	//对存储了A1~A4的变量排序,并输出
        sort(v[i].begin(),v[i].end(),cmp);
        for(int j=0;j<v[i].size();j++){
            printf("%d %d %d\n",v[i][j].num,v[i][j].de,v[i][j].cai);
        }
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值