介绍一个二次排序的小技巧(best coder27期1001jump jump jump)
先来描述一下问题:
有n小孩在比赛跳远,看谁跳的最远。每个小孩可以跳3次,这个小孩的成绩就是三次距离里面的最大值。例如,一个小孩跳3次的距离分别时10, 30和20,那么这个小孩的成绩就是30。给出每个孩子三次跳的距离,问最终每个孩子的排名是多少。 问题分析:
方法1:
由于原问题规模较少,只有两个或三个孩子,可以采用暴力的方法解决,也可满足时间在1s之内(除java代码)。 方法2:
由于该问题按孩子跳远距离的最大值进行排序的话,再次按孩子照顺序输出的时候就会出现,由于原顺序未保存而导致不正确。 解决方案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM 10 typedef struct jump_kid
{
int num;
int value;
int pri; }jump_kid; int max_of_three(int a,int b,int c)
{/*前提a!=b!=c*/
int max3;
if(a > b && a > c)
max3 = a;
else if(b > a && b > c)
max3 = b;
else
max3 = c;
return max3;
} int comp_kids_value(const void *a, const void *b)
{//value降序排序
return ( ((jump_kid *)b)->value - ((jump_kid *)a)->value );
} int comp_kids_num(const void *a, const void *b)
{
return ( ((jump_kid *)a)->num - ((jump_kid *)b)->num );
}
int main()
{
int i,j,num_case,num_kid,jump1,jump2,jump3;
jump_kid kids[MAX_NUM];
scanf("%d",&num_case); for(i = ; i <= num_case; i++)
{
memset(kids,,sizeof(kids));
scanf("%d",&num_kid);
for(j = ; j < num_kid; j++)
{
scanf("%d%d%d",&jump1,&jump2,&jump3);
kids[j].num = j + ;
kids[j].pri = ;
kids[j].value = max_of_three(jump1,jump2,jump3);
} qsort(kids,num_kid,sizeof(jump_kid),comp_kids_value); //第一遍按照value值排序 for( j = ; j < num_kid; j++)
{
kids[j].pri = j + ; //排序后更新优先级
} qsort(kids,num_kid,sizeof(jump_kid),comp_kids_num); for( j = ; j < num_kid; j++)
printf("%d ",kids[j].pri); printf("\n");
} }
介绍一个二次排序的小技巧(best coder27期1001jump jump jump)的更多相关文章
- linux 一个跟踪文件删除的小技巧
最近有同事问我说他有个现场环境,经常会丢失业务文件,每天都出现,几百个里面丢失1到两个. 为了解决这个问题,我让他布置audit,具体可以man一下auditctl. 过了一天,他说audit.log ...
- KVO的使用二:常用方法及小技巧
(文章及代码接上一篇) options详解: KVO的注册方法中有一个options枚举,用来确定观察者的接收消息方法接收的信息,那么具体有什么关联呢?下面通过一段代码来验证是如何关联的.依次选择op ...
- ORACLE EBS FORM 二次开发常用小技巧
1.锁住当前行 Set_Item_Instance_Property('main.import_flag', CURRENT_RECORD, UPDATE_ALLOWED, PROPERTY_OFF) ...
- 【JS简洁之道小技巧】第一期 扁平化数组
介绍两种方法,一是ES6的flat,简单粗暴.二是递归,也不麻烦. flat ES6自带了flat方法,用于使一个嵌套的数组扁平化,默认展开一个嵌套层.flat方法接收一个数字类型参数,参数值即嵌套层 ...
- MapReduce二次排序
默认情况下,Map 输出的结果会对 Key 进行默认的排序,但是有时候需要对 Key 排序的同时再对 Value 进行排序,这时候就要用到二次排序了.下面让我们来介绍一下什么是二次排序. 二次排序原理 ...
- Python入门:数据结构的3个小技巧
这是关于Python的第11篇文章,主要介绍下数据结构的3个小技巧. 排序: 使用sorted函数实现排序. sorted函数按照长短.大小.英文字母的顺序给每个列表的元素进行排序.这个函数经常在数据 ...
- MathType使用中的四个小技巧
MathType是一种比较常见的数学公式编辑器,常常与office搭配着使用,我们在使用的时候有一些要注意的小技巧,下面我们就来给大家介绍介绍MathType使用中的四个小技巧? 技巧一:调整工具栏显 ...
- MapReduce 二次排序
默认情况下,Map 输出的结果会对 Key 进行默认的排序,但是有时候需要对 Key 排序的同时再对 Value 进行排序,这时候就要用到二次排序了.下面让我们来介绍一下什么是二次排序. 二次排序原理 ...
- php composer 相关及版本约束等小技巧
对于现代语言而言,包管理器基本上是标配.Java有Maven,Python有pip,Ruby有gem,Nodejs有npm.PHP的则是PEAR,不过PEAR坑不少: 依赖处理容易出问题 配置非常复杂 ...
随机推荐
- 【交互】抖音VS快手
从能量节约,懒惰的人性本质角度来分析,有点意思. https://www.ui.cn/detail/506135.html
- JavaScript和Jquery个人笔记
目录 前言 价格 * 数量 = 金额 js计算时间差值 判断敲回车或Shift+回车 js控制textarea换行 $(this)选择当前元素 前端调试禁止其他js js添加a标签href属性和文本 ...
- docker基本排错
遇到了一个很奇葩的问题,docker运行一个容器后,执行docker ps -a可以查看到该容器处于运行状态,但是无法进入该容器. 试着使用docker stop ID和docker kill -s ...
- vue -- router路由跳转错误 , NavigationDuplicated
vue-router ≥3.0版本回调形式以及改成promise api的形式了,返回的是一个promise,如果路由地址跳转相同, 且没有捕获到错误,控制台始终会出现如图所示的警告 (注:3.0以下 ...
- [LeetCode] 138. Copy List with Random Pointer 拷贝带随机指针的链表
A linked list is given such that each node contains an additional random pointer which could point t ...
- [LeetCode] 264. Ugly Number II 丑陋数 II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- maven项目打包跳过单元测试
在pom.xml中添加一下代码: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifact ...
- soapUI使用-调用post方法
前言 soapUI的安装请查看此链接:https://www.cnblogs.com/linxiu-0925/p/10138771.html 使用步骤 1打开soapUI 2新建一个项目:New SO ...
- polynomial&generating function学习笔记
生成函数 多项式 形如$\sum_{i=0}^{n}a_i x^i$的代数式称为n阶多项式 核函数 {ai}的核函数为f(x),它的生成函数为sigma(ai*f(i)*x^i) 生成函数的加减 {a ...
- Python Tkinter 之Listbox控件
Listbox为列表框控件,它可以包含一个或多个文本项(text item),可以设置为单选或多选.使用方式为Listbox(root,option...). 常用的参数列表如下: 一些常用的函数: