对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元 PAT 代金券;在 [60, G) 区间内者,可以得到 20 元PAT代金券。全国考点通用,一年有效。同时任课老师还会把总评成绩前 K 名的学生列入课程“名人堂”。本题就请你编写程序,帮助老师列出名人堂的学生,并统计一共发出了面值多少元的 PAT 代金券。

输入格式:

输入在第一行给出 3 个整数,分别是 N(不超过 10 000 的正整数,为学生总数)、G(在 (60,100) 区间内的整数,为题面中描述的代金券等级分界线)、K(不超过 100 且不超过 N 的正整数,为进入名人堂的最低名次)。接下来 N 行,每行给出一位学生的账号(长度不超过15位、不带空格的字符串)和总评成绩(区间 [0, 100] 内的整数),其间以空格分隔。题目保证没有重复的账号。

输出格式:

首先在一行中输出发出的 PAT 代金券的总面值。然后按总评成绩非升序输出进入名人堂的学生的名次、账号和成绩,其间以 1 个空格分隔。需要注意的是:成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。

输入样例:

10 80 5
cy@zju.edu.cn 78
cy@pat-edu.com 87
1001@qq.com 65
uh-oh@163.com 96
test@126.com 39
anyone@qq.com 87
zoe@mit.edu 80
jack@ucla.edu 88
bob@cmu.edu 80
ken@163.com 70

结尾无空行

输出样例:

360
1 uh-oh@163.com 96
2 jack@ucla.edu 88
3 anyone@qq.com 87
3 cy@pat-edu.com 87
5 bob@cmu.edu 80
5 zoe@mit.edu 80

结尾无空行

此题使用结构数组可以更简单的完成

既然是水题,那就复习一下链表吧

最后并不需要释放动态内存 (否则会产生段错误)猜想是因为申请的内存有序性被破坏,在不该出现的地方进行读写

不过整体思路还是很清晰的

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct information{char name[16];int score;int rank;int Voucher;//代金券面值struct information *Next;
}inf;inf* create_link(int N , int G);
inf* insert(inf *head , inf *p);//插入节点
int hall_of_fame(inf *head , int K);//将不符合名人堂的数据剔除 , 并返回应该发放的代金券面值
void Print_Node(inf *head);//遍历输出链表
int main(){int N , G , K , Voucher ;//N是人数 , G是分界线 , K是名人堂最低进入名次inf* head = NULL;scanf("%d %d %d",&N,&G,&K);head = create_link(N , G);Voucher = hall_of_fame(head , K );printf("%d\n",Voucher); Print_Node(head);return 0;
}
inf *create_link(int N , int G){inf *head = NULL;inf *p;int i;for(i = 0;i < N;i ++){p = (inf*)malloc(sizeof(inf));scanf("%s %d",p->name,&p->score);if(p->score >= 60 && p->score < G){//插入数据的同时将每个人获得的代金券存好p->Voucher = 20;}else if(p->score >= G && p->score <= 100){p->Voucher = 50;}else{p->Voucher = 0;}head = insert(head , p);} head->rank = 1;return head;
}
inf *insert(inf *head , inf *stu){inf *s , *p , *q;p = head;s = stu;if(head == NULL){head = s;s->Next = NULL;}else{while((((s->score < p->score)&&(p->Next != NULL)) || ((s->score == p->score) && (strcmp(s->name , p->name) >0))) && (p->Next != NULL)){
/*循环条件严格控制节点的插入位置*/q = p;p = p->Next;}
//跳出while的三种情况if(s->score > p->score){
//注意比当前头结点数据还要大的情况if(head == p){head = s;}else{q->Next = s;}s->Next = p;}else if((s->score == p->score) && (strcmp(s->name , p->name) <= 0)){
//若分数相同,则根据字母降序排列if(head == p){head = s;}else{q->Next = s;}s->Next = p;}else{p->Next = s;s->Next = NULL;}}return head;
}
int hall_of_fame(inf *head , int K){inf *p , *q , *ptr1 , *ptr2 ,*ptr;int count = 1 , rank = 1;int Voucher = 0;p = head;q = p->Next;while(p != NULL){ //先将所有人的代金券面值求和Voucher += p->Voucher;p = p->Next;}if(q == NULL){return Voucher; //只用一个元素 , 那就不需要剔除数据}else{p = head;while(rank <= K && q != NULL){if(q->score == p->score){q->rank = rank;ptr = q;   //此处ptr用于指向现在位于这个名次的最后一位同学q = q->Next;count ++;}else if(q->score < p->score ){rank += count;if(rank <= K){p = q;q->rank = rank;ptr = q;//如果当前的名次还能留在名人堂,ptr指向这个名次的最后一位count = 1;q = q->Next; }else{break;//跌出名人堂 跳出whlie }   }}//开始释放动态内存 ,断开不满足条件的节点
//此时ptr指向的就是名人堂的最后一位,只需执行ptr ->Next = NULL,然后调用遍历输出函数即可if(K == 1){ptr = head;ptr->Next = NULL;}else{  ptr ->Next = NULL;      }}  return Voucher;
}
void Print_Node(inf *head){//遍历输出链表inf *p = head;while(p != NULL){if(p == head){printf("%d %s %d",p->rank,p->name,p->score);//输出排名 , 账号 , 分数即可}else{printf("\n%d %s %d",p->rank,p->name,p->score);}p = p->Next;}
}

名人堂与代金券 (25 分)(C语言)(链表实现)相关推荐

  1. 7-11 名人堂与代金券 (25 分)

    7-11 名人堂与代金券 (25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,总评成绩必 ...

  2. 【CCCC】L2-027 名人堂与代金券 (25分),模拟水题

    problem L2-027 名人堂与代金券 (25分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合 ...

  3. 天梯赛 L2-027 名人堂与代金券 (25 分)

    L2-027 名人堂与代金券 (25 分) 思路: 大体上就是 vector结合结构体储存学生信息,再跑一下自定义排序, 最后在输出上面卡了一下,索性最后还是解决了输出问题 对于在中国大学MOOC(h ...

  4. 天梯赛:L2-027 名人堂与代金券 (25 分)

    题目详情 - L2-027 名人堂与代金券 (25 分) (pintia.cn) 题解:就简单的用一个sort对结构体排序.重点在于对输出的处理上,可能有多个相同的分数.比如n个人都是一样的分数,这时 ...

  5. L2-027 名人堂与代金券 (25分)

    题目描述: 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且 ...

  6. 天梯赛-L2-027 名人堂与代金券(25)(多条件排序)

    对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利: ...

  7. PAT-L2-027(名人堂与代金券)(结构体排序)

    题目链接:https://www.patest.cn/contests/gplt/L2-027 L2-027. 名人堂与代金券 时间限制 150 ms 内存限制 65536 kB 代码长度限制 800 ...

  8. L2-027. 名人堂与代金券,结构体排序

    L2-027. 名人堂与代金券 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对于在中国大学MOOC(http://www.i ...

  9. L2-027 名人堂与代金券 (25 分)

    对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利: ...

最新文章

  1. windows系统用什么web服务器好_墙体保温系统用什么材料比较好
  2. 生产环境子域降级记录
  3. linux远程用户登陆监控
  4. k8s的list-watch机制和 pod调度约束
  5. 关于c#:Filter Serilog日志取决于上下文源到不同的接收器?
  6. iOS 细碎知识整理
  7. Linux Kickstart无人值守安装
  8. ELK filebeat或logstash修改规则之后重写记录到ElasticSearch
  9. noip模拟赛 SAC E#1 - 一道中档题 Factorial
  10. Unity小组工程实践项目《最强外卖员》策划案纠错文档
  11. 鬼谷八荒steam修改器|鬼谷八荒多功能修改器
  12. Windows/Linux/Mac OS下IntelliJ IDEA快捷键中文大全(本人翻译自官方ReferenceCard.pdf)(PDF典藏版)
  13. 与门非门在电子计算机中的应用,与非门电路
  14. Uva - 1589 - Xiangqi
  15. 文化袁探索专栏——消息分发机制
  16. 2020年中国滚刀行业产销及市场规模分析[图]
  17. 【T+】畅捷通T+软件,修改固定资产模块中已经使用卡片的资产编码。
  18. NB-IoT的上行SC-FDMA与下行OFDMA的matlab误码率仿真
  19. winhex入门基础知识
  20. Flink系列之Flink 流式编程模式总结

热门文章

  1. 记一次苦逼的sql注入
  2. java8 Predicate
  3. 如何在远程计算机上播放音乐,如何用iPhone远程遥控电脑播放音乐教程
  4. 对称性在第一型曲线积分中的应用
  5. Word如何拆分单元格
  6. C语言实验——用*号输出字母C的图案
  7. 十进制转余三码或余三码转十进制
  8. OPC OPCUA OPCDA
  9. ASP.NET Core 项目文件夹解读新框架
  10. 厄拉托塞师(Eratosthenes)筛法