PTA(Basic Level)1015.德才论

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”

现给出一批考生的德才分数,请根据司马光的理论给出录取排名。

输入格式:

输入第一行给出 3 个正整数,分别为:N(≤105),即考生总数;L(≥60),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于 H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线 L 的考生也按总分排序,但排在第三类考生之后。

随后 N 行,每行给出一位考生的信息,包括:准考证号 德分 才分,其中准考证号为 8 位整数,德才分为区间 [0, 100] 内的整数。数字间以空格分隔。

输出格式:

输出第一行首先给出达到最低分数线的考生人数 M,随后 M 行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。

输入样例:
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
思路
  • 简单来说就是分等级排序,先按照①等级越高排月前面,②不同等级内按照总分-德分-准考证号
  • ??准考证号可以用int型比较方便
代码
#include<bits/stdc++.h>
using namespace std;
struct student
{
    int id;
    int de;
    int cai;
    student(){}
    student(int _x, int _y, int _z): id(_x),de(_y),cai(_z){}
};

int N, L, H;

int get_class(student x)
{
    if(x.de >= H && x.cai >= H)
        return 1;    //才德全尽,德才总分高到低
    else if(x.de >= H && x.cai < H)
        return 2;    //德胜才,德才总分高到低,但是在才德全尽之后
    else if(x.de < H && x.cai < H && x.de >= x.cai)
        return 3;    //才德兼亡但有德胜才,按总分
    else if(x.de >= L && x.cai >= L)
        return 4;    //有资格录取,按总分
}

bool cmp(student x, student y)
{
    int c1 = get_class(x);
    int c2 = get_class(y);
    if(c1 != c2)
        return c1 < c2;   //种类不同按种类排序
    else if(x.de + x.cai != y.de + y.cai)
            return x.de + x.cai > y.de + y.cai;
    else if(x.de != y.de)
            return x.de > y.de;
    else return x.id < y.id;
}

int main()
{
    scanf("%d%d%d", &N, &L, &H);
    int id, de, cai;

    vector<student> v;
    for(int i=0;i<N;i++)
    {
        scanf("%d%d%d", &id, &de, &cai);
        if(de >= L && cai >= L)
            v.push_back(student(id,de,cai));
    }
    sort(v.begin(), v.end(), cmp);
    printf("%d\n", v.size());
    for(int i=0;i<v.size();i++)
    {
        printf("%d %d %d\n", v[i].id, v[i].de, v[i].cai);
    }

    return 0;
}
引用

https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312

原文地址:https://www.cnblogs.com/MartinLwx/p/11624873.html

时间: 2024-11-09 01:01:25

PTA(Basic Level)1015.德才论的相关文章

Basic Level 1015 - 德才论

1015 - 德才论 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人.” 现给出一批考生的德才分数,请根据司马光的理论给出录取排名. 输入格式: 输入第一行给出 3 个正整数,分别为:N(≤),即考生总数:L(≥),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取:H(<),为优先录取线——德分和才分均不低于此线的被定义为“才德

来自PTA Basic Level的三只小野兽

点我阅读原文 最近利用闲暇时间做了一下 PTA Basic Level[1] 里的题,里面现在一共有 95 道题,这些题大部分很基础,对于刷倦了 leetcode 的小伙伴可以去里面愉快的玩耍哦. 这里我挑了三个挺有意思的题来做个简单记录,欢迎和大家一起讨论交流. 请听题: 第一题:1009 说反话 题目描述 给定一个英语句子,各个单词之间用空格分隔.要求你编写程序,将句中所有单词的顺序颠倒输出. 输入示例 Hello World Here I Come 输出示例 Come I Here Wor

PTA(Basic Level)1057.数零壹

给定一串长度不超过 105 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0.多少 1.例如给定字符串 PAT (Basic),其字母序号之和为:16+1+20+2+1+19+9+3=71,而 71 的二进制是 1000111,即有 3 个 0.4 个 1. 输入格式: 输入在一行中给出长度不超过 105.以回车结束的字符串. 输出格式: 在一行中先后输出 0 的个数和 1 的个数,其间以

PTA(Basic Level)1012.数字分类

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1?n2+n3?n4?: A3 = 被 5 除后余 2 的数字的个数: A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位: A5 = 被 5 除后余 4 的数字中最大数字. 输入格式: 每个输入包含 1 个测试用例.每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过

PTA(Basic Level)1016.部分A+B

正整数 A 的"*D**A(为 1 位整数)部分"定义为由 A* 中所有 *D**A* 组成的新整数 PA.例如:给定 A=3862767,DA=6,则 A 的"6 部分"*P**A* 是 66,因为 A 中有 2 个 6. 现给定 A.DA.B.DB,请编写程序计算 PA+PB. 输入格式: 输入在一行中依次给出 A.DA.B.DB,中间以空格分隔,其中 0<A,B<1010. 输出格式: 在一行中输出 PA+PB 的值. 输入样例 1: 386276

PTA(Basic Level)1029.旧键盘

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及实际被输入的文字.每段文字是不超过 80 个字符的串,由字母 A-Z(包括大.小写).数字 0-9.以及下划线 _(代表空格)组成.题目保证 2 个字符串均非空. 输出格式: 按照发现顺序,在一行中输出坏掉的键.其中英文字母只输出大写,每个坏键只输出一次.题目保证至少有 1 个坏键. 输入样例: 7

PTA(Basic Level)1027.打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指每行输出奇数个符号:各行符号中心对齐:相邻两行符号数差2:符号数先从大到小顺序递减到1,再从小到大顺序递增:首尾符号数相等. 给定任意N个符号,不一定能正好组成一个沙漏.要求打印出的沙漏能用掉尽可能多的符号. 输入格式: 输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔. 输出格式: 首先打印出

PTA(Basic Level)1087.有多少不同的值

当自然数 n 依次取 1.2.3.--.N 时,算式 ?n/2?+?n/3?+?n/5? 有多少个不同的值?(注:?x? 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: 输入给出一个正整数 N(2≤N≤104). 输出格式: 在一行中输出题面中算式取到的不同值的个数. 输入样例: 2017 输出样例: 1480 思路 充分说明了STL的重要性,掌握了它代码量就少了好多- 代码 #include<bits/stdc++.h> using namespace std;

PTA(Basic Level)1077.互评成绩计算

在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平均分记为 G1:老师给这个组的评分记为 G2.该组得分为 (G1+G2)/2,最后结果四舍五入后保留整数分.本题就要求你写个程序帮助老师计算每个组的互评成绩. 输入格式: 输入第一行给出两个正整数 N(> 3)和 M,分别是分组数和满分,均不超过 100.随后 N 行,每行给出该组得到的 N 个分数