1015 德才论 (乙)

https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=994805307551629312

简单解释题目的分类:题目中有四类学生,为了筛选的便捷,先把条件最严苛的挑选出来,前提是德和才都>L。

第一类:德和才>H。

第二类:德>=H,才<H,

第三类:德和才<H,德>才,

第四类:就是剩下的。关于类按总分排序,相同总分按照德分降序,以上都相同按准考证降序。

思路:首先要读取学生的德才分数,这里用vector动态数组作为容器。分类出来的学生也需要定义四个类。所以需要定义结构体将准考证号和德才封装到一起作为一个类(push_back)。之后考虑到输出排序的问题,属于多条件级联排序(总分相同时 → 德分相同时 → 准考证号)。

// 伪代码表示排序逻辑
if (总分不同) {
    按总分降序排列
} else if (德分不同) {
    按德分降序排列  
} else {
    按准考证号升序排列
}
                                                      //(逻辑)

// 多条件排序的通用模式
if (第一条件不同) {
    return 第一条件的比较结果;
} else if (第二条件不同) {
    return 第二条件的比较结果;
} else {
    return 第N条件的比较结果;
}                                                    //(对下面比较代码逻辑的解释)

auto cmp=[](const Student& a, const Student& b){
        int sum_a=a.de+a.cai, sum_b=b.de + b.cai;
        if(sum_a!=sum_b) return sum_a>sum_b;
        else if(a.de!=b.de) return a.de>b.de;
        else return a.id<b.id;
    };     

为什么return a>b?

---------------------------------------------------------------------------------------------------------------------------------

知识点:结构体用于定义自定义数据类型,将相关数据字段组合

相当于创建了一个新的"考生"数据类型

使代码更模块化、可读性更好、更易维护

#include<bits/stdc++.h>
using namespace std;
struct Student{
        int id,de,cai;
    };
int main()
{
int N,L,H;
    cin>>N>>L>>H;
    vector<Student> students(N);
    for(int i=0;i<N;i++)
    {
        cin>>students[i].id>>students[i].de>>students[i].cai;
    }
    vector<Student> classes[4];
    for(const auto& stu : students){
        if(stu.de>=L &&stu.cai>=L)
        {
            if(stu.de>=H && stu.cai>=H) classes[0].push_back(stu);
             else if(stu.de>=H &&stu.cai<H) classes[1].push_back(stu);
             else if(stu.de>=stu.cai) classes[2].push_back(stu);
                 else                 classes[3].push_back(stu);
        }
    }
    auto cmp=[](const Student& a, const Student& b){
        int sum_a=a.de+a.cai, sum_b=b.de + b.cai;
        if(sum_a!=sum_b) return sum_a>sum_b;
        else if(a.de!=b.de) return a.de>b.de;
        else return a.id<b.id;
    };
    for(auto& c: classes) sort(c.begin(),c.end(), cmp);
    int M=0;
    for(const auto& c:classes){
        M+=c.size();
    }
    cout<<M<<endl;
    for(const auto& c:classes){
        for(const auto& stu : c){
            printf("%d %d %d\n", stu.id,stu.de,stu.cai);
        }
    }
    return 0;
}

对题目中几个auto进行解释:

for(auto& c: classes) sort(c.begin(),c.end(), cmp);这里的auto让编译器去识别一下c的类型,这里是vector<Student>&,&是使用引用的标志,防止拷贝整个vector。目的是要修改每个类别的vector(进行排序),所以需要用引用。

auto cmp=[](const Student& a, const Student& b){...};为什么用 auto:Lambda表达式的类型是编译器生成的匿名类型,我们无法直接写出这个类型名称,auto 让编译器自动推导这个复杂的类型。

总体来说的用处都一样。

auto cmp = [](const Student& a, const Student& b) {...};是lambda表达式,为什么要用?

目前的理解是lambda不用思考类型了

后续更新其他写法。

关于“德才论”的具体定义和背景未在提供的参考资料中提及,但从通常的理解来看,“德才论”涉及品德与才能之间的关系评估。假设目标是在C语言环境下编写一个简单的程序来模拟基于某种评分机制对个人的品德(德)和能力(才)进行评价,则可以构建如下案例。 ### 德才论 C语言 实现 #### 定义结构体表示人员信息 创建一个结构体用于存储每个人的姓名、道德分数以及才华分数: ```c #include <stdio.h> #include <string.h> #define MAX_NAME_LENGTH 50 typedef struct { char name[MAX_NAME_LENGTH]; float morality_score; float talent_score; } Person; void evaluate_person(Person *p); int compare(const void *a, const void *b); int main() { // 初始化若干人的数据 Person people[] = { {"Alice", 87.5f, 92.3f}, {"Bob", 76.4f, 88.1f}, {"Charlie", 90.0f, 85.5f} }; int n = sizeof(people)/sizeof(people[0]); // 对所有人进行综合评价并打印原始列表 for (int i=0; i<n; ++i){ evaluate_person(&people[i]); printf("Name:%s Morality Score:%.2f Talent Score:%.2f\n", people[i].name, people[i].morality_score, people[i].talent_score); } // 使用qsort按照特定规则排序 qsort(people, n, sizeof(Person), compare); puts("\nAfter sorting:"); // 打印排序后的列表 for (int i=0; i<n; ++i){ printf("Name:%s Morality Score:%.2f Talent Score:%.2f\n", people[i].name, people[i].morality_score, people[i].talent_score); } } // 综合评价函数,这里简单地取平均作为总评成绩 void evaluate_person(Person *p) { p->morality_score /= 2; // 假设最大分为100分制下的调整 p->talent_score /= 2; } // 排序比较函数,先按道德得分降序排列;如果相同则按才华得分升序排列 int compare(const void *a, const void *b) { Person *personA = (Person *)a; Person *personB = (Person *)b; if(personA->morality_score != personB->morality_score) return (personB->morality_score - personA->morality_score)>0?1:-1; else return (personA->talent_score - personB->talent_score)>0?1:-1; } ``` 此代码实现了基本的数据输入、处理逻辑以及输出展示功能,并通过`qsort()`完成了自定义条件下的排序操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值