介绍一个二次排序的小技巧(best coder27期1001jump jump jump)
2015-01-28 16:40
218 查看
先来描述一下问题:
问题描述
设计新结构体存储一个孩子的三个结构信息,跳远距离,当前顺序和排序后的优先级。然后分别按照跳远距离排序,然后根据顺序更新优先级,然后再按照最初的输入顺序进行排序。
代码如下:
问题描述
有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 = 1; i <= num_case; i++) { memset(kids,0,sizeof(kids)); scanf("%d",&num_kid); for(j = 0; j < num_kid; j++) { scanf("%d%d%d",&jump1,&jump2,&jump3); kids[j].num = j + 1; kids[j].pri = 0; kids[j].value = max_of_three(jump1,jump2,jump3); } qsort(kids,num_kid,sizeof(jump_kid),comp_kids_value); //第一遍按照value值排序 for( j = 0; j < num_kid; j++) { kids[j].pri = j + 1; //排序后更新优先级 } qsort(kids,num_kid,sizeof(jump_kid),comp_kids_num); for( j = 0; j < num_kid; j++) printf("%d ",kids[j].pri); printf("\n"); } }
相关文章推荐
- 介绍一个二次排序的小技巧(best coder27期1001jump jump jump)
- 【HDU5649 BestCoder Round 76 (div1)D】【二分+线段树】DZY Loves Sorting 全排列1~n 区间升序降序排序 最后k位置的数是几
- 杭电OJ BestCoder28期1001Missing number问题(小技巧偏移法)
- 杭电OJ BestCoder28期1001Missing number问题(小技巧偏移法)
- 【HDU5654 BestCoder Round 77 (div1) D】【前驱位置思想 排序 树状数组】xiaoxin and his watermelon candy 区间内多少个不同连续单升三元
- 【HDU5188 BestCoder Round 33C】【贪心排序+DP】zhx and contest 考试不被怀疑作弊条件下达到至少m分的最少时间
- 【HDU5808 BestCoder Round 86E】【时间排序 树状数组计数 bitsetDP 或分治】Price List Strike Back 距离范围、区间范围商店购物 使得价值和恰为m
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- VB 任意随机数(N-M)的通用函数(单取、多取存入数组、排序等功能) 内附随机数介绍
- Who do you think is the best coder and why?
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)
- 递归算法在javascript中使用的小技巧 (javascript的对象封装方法介绍)