当前位置: 首页 > news >正文

C语言应用实例:奋勇争先锋(贪心,qsort用法)

一、题目

还记得上次那个奋勇争先的题目吗,聪明的你帮助老师找出了第一名的同学。

现在,有个类似的问题:
已知每一位同学的解题数量和罚时,这次希望你能输出排名靠前的若干同学的名单。

注:排名首先依据做题数量,若做题数量相同,则比较罚时,罚时少的排名靠前。

要求

第一行是数据组数C,代表有C组测试实例。

每一组数据第一行两个整数N和M,N代表有N个人的成绩,M表示老师需要你输出前M名的名单。

接下来N行,每一行依次给出名字Name,做出的题目数量num和罚时time
( 1<=C<=10, 2<M<=N<=1000, Name的长度最大为10,1<=num<=10, 10<=time<=100000 )

每组测试数据输出M行,第i行为第i名的名字、解题数量和罚时,中间用空格隔开。

每组数据后空一行

二、题解

1.思路

这道题的难点在于结构体的双重排序(结构体的定义前面已经讲过了这里就不多赘叙了)

主包在第一次看到这个题的时候的想法是用两边qsort函数

如下

int compare1(const void *a,const void *b){struct Stu *m1 = (struct Stu*)a;struct Stu *m2 = (struct Stu*)b;if(m1->num > m2->num) return -1;if(m1->num < m2->num) return 1;
}int compare2(const void *a,const void *b){struct Stu *m1 = (struct Stu*)a;struct Stu *m2 = (struct Stu*)b;if(m1->num == m2->num&&m1->time>m2->time) return 1;if(m1->num == m2->num&&m1->time<m2->time) return -1;
}int main(){
qsort(stulist,N,sizeof(struct Stu),compare1);qsort(stulist,N,sizeof(struct Stu),compare2);
return 0;
}

但这样写的话第二次排序会覆盖住第一次排序的结果,所以不能这么写

正确处理写法如下(调用一遍qsort)

int compare(const void *a, const void *b){struct Stu *m1 = (struct Stu*)a;struct Stu *m2 = (struct Stu*)b;// 首先按num降序排序if(m1->num != m2->num){return m2->num - m1->num;  // 降序}// 如果num相同,按time升序排序else{return m1->time - m2->time;  // 升序}
}

最后输出前N就行

2.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>struct Stu{char name[11];int num;int time;
};int compare(const void *a, const void *b){struct Stu *m1 = (struct Stu*)a;struct Stu *m2 = (struct Stu*)b;// 首先按num降序排序if(m1->num != m2->num){return m2->num - m1->num;  // 降序}// 如果num相同,按time升序排序else{return m1->time - m2->time;  // 升序}
}int main(){int C;scanf("%d",&C);for(int i=0;i<C;i++){int N,M;scanf("%d %d",&N,&M);struct Stu *stulist=(struct Stu*)malloc(sizeof(struct Stu)*N);for(int j=0;j<N;j++){scanf("%s %d %d", stulist[j].name, &stulist[j].num, &stulist[j].time);}qsort(stulist, N, sizeof(struct Stu), compare);for(int j=0;j<M;j++){printf("%s %d %d\n", stulist[j].name, stulist[j].num, stulist[j].time);}printf("\n");free(stulist);}return 0;
}

http://www.dtcms.com/a/582179.html

相关文章:

  • 机器学习数学知识温习(2)- 高斯-正态分布
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — Push Kit
  • 济南网站建设 泉诺家装公司排名前十
  • 网站开发主要都做些什么佛山网站优化有
  • 机器人+工业领域=?
  • 网站三大标签优化中山企业网站建设
  • 关于网站开发书籍域名服务器有哪些
  • 27.java openCV4.x 入门-Imgproc之图像线性混合
  • 基于Logistic映射与Chen超混沌系统结合DNA分块编解码的图像加密技术
  • dy自动化遇到的滑动问题
  • 打开上次浏览的网站百度seo搜索营销新视角
  • 购物网站设计意义推荐友情链接
  • Java面向对象核心面试技术考点深度解析
  • Python中的异步与并行
  • java每日精进 11.06【线程本地存储与异步上下文传递详解】
  • 用Python写爬虫获取大网站的每日新闻,为个人系统添加“今日热点”模块,这个想法现实吗?
  • 网站宽度 超宽推广普通话手抄报文字内容
  • [2-02-01].第03节:环境搭建 - 库表等基础数据准备
  • 建设网站视频百度云盘如何在网站上做免费代理
  • 计算机视觉(二):光度立体视觉与图像滤波
  • JVM新生代转老年代机制详解
  • 对网站的建议很看好未来做生鲜的网站
  • 腾讯云升级技术服务:发布“卓越架构+Multi-Agent”与可观测AI平台,实现服务产品化
  • 做古风头像的网站一般网站建设多少钱便宜的网站好吗
  • 面试高频问题和回答策略-1
  • 计算机系统---USB的四种传输方式
  • 网站建设所需要的材料济南做网站优化公司
  • 西安网站制作定制提升网站建设
  • Hopfield神经网络简介
  • 2025年TRE SCI1区TOP,随机环境下无人机应急医疗接送与配送的先进混合方法,深度解析+性能实测