题目链接:1015 德才论 (25 point(s))
分析

由题意可知,需要将考生按照分数进行一个分类(级),然后在每一级中按照分数排序。输入的时候将每个人的总分等级录取人数先算出来。然后按照自定义的compare函数进行排序。



int compare(const Stu* stu1, const Stu* stu2)函数逻辑如下:

  1. 等级如果不同的话,直接按照等级升序(A:圣人,B:君子,C:愚人,D:小人,E:不录取)排列。
  2. 如果等级相同的话,说明他们在一个类里面,就要按照总分降序排列。
  3. 如果总分相同的话,那德分肯定比较重要,就按照德分降序排列。
  4. 如果德分也相同的话,那才分肯定也相同。那怎么办呢?
  5. 我第一次就是错在这儿,我以为这个时候返回0(相同),其实还有一个条件,那就是按照准考证号升序排列。Emmm…
代码
/*
Score 25
Run Time 105ms
@author wowpH
@version 2.2
*/ #include<stdio.h>
#include<stdlib.h> int L, H; // 录取最低分数线和优先录取线 typedef struct Student {
int id; // 准考证号
short de, cai, all; // 德分,才分,总分
char level; // 等级,A圣人,B君子,C愚人,D小人,E淘汰
}Stu; // 考生
Stu stu[100001]; // 考生 char getLevel(short de, short cai) {
if (de >= H) {
if (cai >= H) {
return 'A'; // 圣人
}
else if (cai >= L) {
return 'B'; // 君子
}
else {
return 'E'; // 淘汰
}
}
else if (de >= L) {
if (cai >= H) {
return 'D'; // 小人
}
else if (cai >= L) {
if (de >= cai) {
return 'C'; // 愚人
}
else {
return 'D'; // 小人
}
}
else {
return 'E'; // 淘汰
}
}
else {
return 'E'; // 淘汰
}
} int compare(const Stu* stu1, const Stu* stu2) {
if (stu1->level != stu2->level) { // 等级不同
return stu1->level - stu2->level; // 按照等级升序排列
}
if (stu1->all != stu2->all) { // 等级相同,总分不同
return stu2->all - stu1->all; // 按照总分降序排列
}
if (stu1->de != stu2->de) { // 等级和总分都相同,德分不同
return stu2->de - stu1->de; // 按照德分降序排列
}
return stu1->id - stu2->id; // 若等级,总分,德分都相同,按照准考证号升序排列
} int main() {
int N, enter; // enter录取的人数
scanf("%d%d%d", &N, &L, &H); // 输入人数,最低录取分数线和优先录取线
enter = N; // 初始全部录取
for (int i = 0; i < N; i++) {
scanf("%d%d%d", &stu[i].id, &stu[i].de, &stu[i].cai); // 考生信息
stu[i].all = stu[i].de + stu[i].cai; // 计算总分
stu[i].level = getLevel(stu[i].de, stu[i].cai); // 分级
if ('E' == stu[i].level) {
enter--; // 若考生被淘汰,录取人数减1
}
}
qsort(stu, N, sizeof(Stu), compare); // 排序,头文件stdlib.h
printf("%d\n", enter);
for (int i = 0; i < enter; i++) {
printf("%d %d %d\n", stu[i].id, stu[i].de, stu[i].cai);
}
}

版权声明:

  1. 转载请于首页注明链接形式的PAT(B)1015 德才论(C)——wowpH
  2. 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息)。
  3. 如果有疑问欢迎评论留言,尽量解答。

最新文章

  1. div内填内容
  2. java内功 ---- jvm虚拟机原理总结,侧重于GC
  3. Android_Layout (一)
  4. MKMapView的使用
  5. script加defer=&quot;defer&quot; 的意义
  6. Windows10家庭版运行应用提示”管理员已阻止你运行此应用...“的解决办法
  7. Java框架spring 学习笔记(十五):操作MySQL数据库
  8. Java:【面向对象:类的定义,静态变量,成员变量,构造函数,封装与私有,this】
  9. Luogu4782 【模板】2-SAT 问题(2-SAT)
  10. 异常could not retrieve snapshot
  11. GS 服务器端开启webservice 远程调试的方法
  12. NEERC Southern Subregional 2012
  13. 修改字段字符集 mysql 修改 锁表 show processlist; 查看进程 Waiting for table metadata lock
  14. AirSim的搭建和使用
  15. Batch Gradient Descent vs. Stochastic Gradient Descent
  16. epplus excel数据导出(数据量有点大的情况) Web和Client
  17. (一)java概述
  18. shiro 实现自己定义权限规则校验
  19. PHP通过session id 实现session共享和登录验证的代码
  20. day01_14.遍历数组

热门文章

  1. Windows下OpenFOAM开发及使用环境配置指南 (1)【转载】
  2. ICEM-圆柱与长方体相切
  3. css让文字竖着排列 writing-mode 属性
  4. Send me - PLANETSHAKERS
  5. linux内核中#if IS_ENABLED(CONFIG_XXX)与#ifdef CONFIG_XXX的区别
  6. Android 滚动隐藏标题栏 和FAB按钮实现
  7. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_10-前端显示当前用户-jwt查询接口
  8. 最简单的freemarker用法实例
  9. APP手工项目02-用例编写-测试报告-fiddler弱网测试
  10. laravel5.2总结