先来描述一下问题:

问题描述
有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)的更多相关文章

  1. linux 一个跟踪文件删除的小技巧

    最近有同事问我说他有个现场环境,经常会丢失业务文件,每天都出现,几百个里面丢失1到两个. 为了解决这个问题,我让他布置audit,具体可以man一下auditctl. 过了一天,他说audit.log ...

  2. KVO的使用二:常用方法及小技巧

    (文章及代码接上一篇) options详解: KVO的注册方法中有一个options枚举,用来确定观察者的接收消息方法接收的信息,那么具体有什么关联呢?下面通过一段代码来验证是如何关联的.依次选择op ...

  3. ORACLE EBS FORM 二次开发常用小技巧

    1.锁住当前行 Set_Item_Instance_Property('main.import_flag', CURRENT_RECORD, UPDATE_ALLOWED, PROPERTY_OFF) ...

  4. 【JS简洁之道小技巧】第一期 扁平化数组

    介绍两种方法,一是ES6的flat,简单粗暴.二是递归,也不麻烦. flat ES6自带了flat方法,用于使一个嵌套的数组扁平化,默认展开一个嵌套层.flat方法接收一个数字类型参数,参数值即嵌套层 ...

  5. MapReduce二次排序

    默认情况下,Map 输出的结果会对 Key 进行默认的排序,但是有时候需要对 Key 排序的同时再对 Value 进行排序,这时候就要用到二次排序了.下面让我们来介绍一下什么是二次排序. 二次排序原理 ...

  6. Python入门:数据结构的3个小技巧

    这是关于Python的第11篇文章,主要介绍下数据结构的3个小技巧. 排序: 使用sorted函数实现排序. sorted函数按照长短.大小.英文字母的顺序给每个列表的元素进行排序.这个函数经常在数据 ...

  7. MathType使用中的四个小技巧

    MathType是一种比较常见的数学公式编辑器,常常与office搭配着使用,我们在使用的时候有一些要注意的小技巧,下面我们就来给大家介绍介绍MathType使用中的四个小技巧? 技巧一:调整工具栏显 ...

  8. MapReduce 二次排序

    默认情况下,Map 输出的结果会对 Key 进行默认的排序,但是有时候需要对 Key 排序的同时再对 Value 进行排序,这时候就要用到二次排序了.下面让我们来介绍一下什么是二次排序. 二次排序原理 ...

  9. php composer 相关及版本约束等小技巧

    对于现代语言而言,包管理器基本上是标配.Java有Maven,Python有pip,Ruby有gem,Nodejs有npm.PHP的则是PEAR,不过PEAR坑不少: 依赖处理容易出问题 配置非常复杂 ...

随机推荐

  1. 【交互】抖音VS快手

    从能量节约,懒惰的人性本质角度来分析,有点意思. https://www.ui.cn/detail/506135.html

  2. JavaScript和Jquery个人笔记

    目录 前言 价格 * 数量 = 金额 js计算时间差值 判断敲回车或Shift+回车 js控制textarea换行 $(this)选择当前元素 前端调试禁止其他js js添加a标签href属性和文本 ...

  3. docker基本排错

    遇到了一个很奇葩的问题,docker运行一个容器后,执行docker ps -a可以查看到该容器处于运行状态,但是无法进入该容器. 试着使用docker stop ID和docker kill -s ...

  4. vue -- router路由跳转错误 , NavigationDuplicated

    vue-router ≥3.0版本回调形式以及改成promise api的形式了,返回的是一个promise,如果路由地址跳转相同, 且没有捕获到错误,控制台始终会出现如图所示的警告 (注:3.0以下 ...

  5. [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 ...

  6. [LeetCode] 264. Ugly Number II 丑陋数 II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  7. maven项目打包跳过单元测试

    在pom.xml中添加一下代码: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifact ...

  8. soapUI使用-调用post方法

    前言 soapUI的安装请查看此链接:https://www.cnblogs.com/linxiu-0925/p/10138771.html 使用步骤 1打开soapUI 2新建一个项目:New SO ...

  9. polynomial&generating function学习笔记

    生成函数 多项式 形如$\sum_{i=0}^{n}a_i x^i$的代数式称为n阶多项式 核函数 {ai}的核函数为f(x),它的生成函数为sigma(ai*f(i)*x^i) 生成函数的加减 {a ...

  10. Python Tkinter 之Listbox控件

    Listbox为列表框控件,它可以包含一个或多个文本项(text item),可以设置为单选或多选.使用方式为Listbox(root,option...). 常用的参数列表如下: 一些常用的函数: