Problem Description

Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。

Input

测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有 N

行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。

Output

对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3

时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

Sample Input

3 1

000007 James 85

000010 Amy 90

000001 Zoe 60

4 2

000007 James 85

000010 Amy 90

000001 Zoe 60

000002 James 98

4 3

000007 James 85

000010 Amy 90

000001 Zoe 60

000002 James 90

0 0

Sample Output

Case 1:

000001 Zoe 60

000007 James 85

000010 Amy 90

Case 2:

000010 Amy 90

000002 James 98

000007 James 85

000001 Zoe 60

Case 3:

000001 Zoe 60

000007 James 85

000002 James 90

000010 Amy 90

这个题目难度不大,但是不能用普通的排序,不然会超时。

一定要用快排!

以前我对java的import java.util.Arrays的:(

sort(T[] a,Comparator< ? super T> c)根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的(也就是说,对于数组中的任何 e1 和 e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。

保证此排序是稳定的:不会因调用 sort 方法而对相等的元素进行重新排序。

该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n*log(n) 性能。

参数:

a - 要排序的数组

c - 确定数组顺序的比较器。null 值指示应该使用元素的自然顺序。 )

不怎么理解怎么用比较器,现在完全明白了,O(∩_∩)O哈哈~、、、

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. import java.util.Scanner;
  4. public class Main{
  5. public static void main(String[] args) {
  6. Scanner sc = new Scanner(System.in);
  7. int time = 1;
  8. while (sc.hasNext()) {
  9. int n = sc.nextInt();
  10. int m = sc.nextInt();
  11. if (n == 0 && m == 0) {
  12. break;
  13. }
  14. // System.out.println(n+" "+m);
  15. student[] s = new student[n];
  16. for (int i = 0; i < n; i++) {
  17. s[i] = new student();
  18. s[i].no = sc.nextInt();
  19. s[i].name = sc.next();
  20. s[i].results = sc.nextInt();
  21. }
  22. System.out.println("Case " + (time++) + ":");
  23. if (m == 1) {
  24. sort1(s);
  25. for (int i = 0; i < s.length; i++) {
  26. int t = Integer.toString(s[i].no).length();
  27. for (int k = 6; k > t; k--) {
  28. System.out.print(0);
  29. }
  30. System.out.println(s[i].no + " " + s[i].name + " "
  31. + s[i].results);
  32. }
  33. continue;
  34. }
  35. if (m == 2) {
  36. sort2(s);
  37. for (int i = 0; i < s.length; i++) {
  38. int t = Integer.toString(s[i].no).length();
  39. for (int k = 6; k > t; k--) {
  40. System.out.print(0);
  41. }
  42. System.out.println(s[i].no + " " + s[i].name + " "
  43. + s[i].results);
  44. }
  45. continue;
  46. }
  47. if (m == 3) {
  48. sort3(s);
  49. for (int i = 0; i < s.length; i++) {
  50. int t = Integer.toString(s[i].no).length();
  51. for (int k = 6; k > t; k--) {
  52. System.out.print(0);
  53. }
  54. System.out.println(s[i].no + " " + s[i].name + " "
  55. + s[i].results);
  56. }
  57. continue;
  58. }
  59. }
  60. }
  61. private static void sort3(student[] s) {
  62. Arrays.sort(s,new Comparator<student>() {
  63. @Override
  64. public int compare(student o1, student o2) {
  65. if(o1.results==o2.results){
  66. if(o1.no>o2.no){
  67. return 1;
  68. }else{
  69. return -1;
  70. }
  71. }
  72. if(o1.results>o2.results){
  73. return 1;
  74. }
  75. return -1;
  76. }
  77. });
  78. }
  79. private static void sort2(student[] s) {
  80. Arrays.sort(s, new Comparator<student>() {
  81. @Override
  82. public int compare(student o1, student o2) {
  83. if (o1.name.equals(o2.name)) {
  84. if (o1.no > o2.no) {
  85. return 1;
  86. //返回1,就是交换位置!!!
  87. } else {
  88. return -1;
  89. }
  90. } else {
  91. if (o1.name.length() > o2.name.length()) {
  92. for (int i = 0; i < o2.name.length(); i++) {
  93. if (o1.name.charAt(i) > o2.name.charAt(i)) {
  94. return 1;
  95. }
  96. if (o1.name.charAt(i) < o2.name.charAt(i))
  97. {
  98. return -1;
  99. }
  100. }
  101. return 1;
  102. } else if (o1.name.length() < o2.name.length()) {
  103. for (int i = 0; i < o1.name.length(); i++) {
  104. if (o1.name.charAt(i) > o2.name.charAt(i)) {
  105. return 1;
  106. }
  107. if (o1.name.charAt(i) < o2.name.charAt(i))
  108. {
  109. return -1;
  110. }
  111. }
  112. return -1;
  113. } else {
  114. for (int i = 0; i < o1.name.length(); i++) {
  115. if (o1.name.charAt(i) > o2.name.charAt(i)) {
  116. return 1;
  117. }
  118. if (o1.name.charAt(i) < o2.name.charAt(i))
  119. {
  120. return -1;
  121. }
  122. }
  123. }
  124. }
  125. return 0;
  126. }
  127. });
  128. }
  129. private static void sort1(student[] s) {
  130. Arrays.sort(s, new Comparator<student>() {
  131. @Override
  132. public int compare(student o1, student o2) {
  133. // 按照no的大小 s从小到大排序
  134. if (o1.no > o2.no) {
  135. return 1;
  136. } else {
  137. return -1;
  138. }
  139. }
  140. });
  141. // for(int i=0;i<s.length-1;i++){
  142. // for(int j=i+1;j<s.length;j++){
  143. // if(s[i].no>s[j].no){
  144. // student tm = s[i];
  145. // s[i] = s[j];
  146. // s[j]=tm;
  147. // }
  148. // }
  149. // }
  150. }
  151. }
  152. class student {
  153. public int no;
  154. public String name;
  155. public int results;
  156. }

HDOJ(HDU) 1862 EXCEL排序(类对象的快排)的更多相关文章

  1. 题目1023:EXCEL排序(多关键字+快排+尚未解决)

    http://ac.jobdu.com/problem.php?pid=1023 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行“Ca ...

  2. hdoj 1862 EXCEL排序

    EXCEL排序 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. java排序,冒泡排序,选择排序,插入排序,快排

    冒泡排序 时间复杂度:O(n^2) 空间复杂度O(1) 稳定性:稳定 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最 ...

  4. HDU 1862 EXCEL次序 (排序水问题)

    Problem Description Excel对能够记录一组由任意列排序指定.现在,请把你编译的代码类似特征.   Input 測试输入包括若干測试用例. 每一个測试用例的第1行包括两个整数 N ...

  5. 杭电 1862 EXCEL排序(sort+结构体)

    Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能.   Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<=100000 ...

  6. HDOJ/HDU 2535 Vote(排序、)

    Problem Description 美国大选是按各州的投票结果来确定最终的结果的,如果得到超过一半的州的支持就可以当选,而每个州的投票结果又是由该州选民投票产生的,如果某个州超过一半的选民支持希拉 ...

  7. sort(排序) qsort(快排) bsearch(二分查找)

    sort: 一.对int类型数组排序 int a[100]; int cmp ( int a , int b ) //不必强制转换 { return a < b;//升序排列. } sort ( ...

  8. 排序--QuickSort 快排

    Quick の implementation 快排,就像它的名字一定,风一样的快.基本上算是最快的排序算法了.快排的基本思想是选择一个切分的元素.把这个元素排序了.所有这个元素左边的元素都小于这个元素 ...

  9. 普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序 - 三路快排 Duplicate Keys

    很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路 ...

随机推荐

  1. IOS 获取通讯录中信息

    获取通讯录中信息 一. 我们设置一个ABAddressBookRef类型的属性addressBook. 二. 要获得通讯录中的信息,我们需要获取访问通讯录的权限. 在运行下面的获取权限的方法的时候,系 ...

  2. iOS平台基于ffmpeg的视频直播技术揭秘

    现在非常流行直播,相信很多人都跟我一样十分好奇这个技术是如何实现的,正好最近在做一个ffmpeg的项目,发现这个工具很容易就可以做直播,下面来给大家分享下技术要点: 首先你得编译出ffmpeg运行所需 ...

  3. session绑定javaBean

    1.HttpSessionBindingListener   这个监听器,可以让javaBean对象,感知它被绑定到session中或从session中移除.2.HttpSessionActivati ...

  4. Android(java)学习笔记244:多媒体之SurfaceView

    1. SurfaceView:     完成单位时间内界面的快速切换(游戏界面流畅感). 我们之前知道一般的View,只能在主线程里面显示,主线程中更新UI.但是SurfaceView可以在子线程中里 ...

  5. Thinkphp 3.2及以上版本实现支付宝担保交易、即时到账接口类、函数和使用方法

    给客户开发网站时需要用到支付宝在线付款功能,小云到thinkphp网站溜了一圈,代码是有,可是都不怎么全,因此这篇文章诞生了! 本篇文章讲解了三个类的实现,担保交易.即时到账.双功能收款(该功能支付宝 ...

  6. ACM比赛技巧

    一.语言是最重要的基本功   无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关.亚洲赛区的比赛支持的语言包括C/C++与JAVA.笔者首先说说JAVA,众所周知,作 ...

  7. cocopods安装

    CocoaPods安装和使用教程 Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 目录 CocoaP ...

  8. 判断iPhone和iPad 判断设备版本

    //判断iPhone和iPad #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInt ...

  9. Asp.net 菜单控件

    本文介绍的菜单控件采用的css 和ul list来显示菜单,生成的html小,无需javascript支持,对大部分的浏览器都支持,除ie6要单独修改css也可以使其支持. 通过本文可以了解asp.n ...

  10. Sql Server 远程过程调用失败

    很多搞开发的同志们,相信在刚刚使用sql server2008+c#2012(2012以上版本)会出现下面图片中的问题,这时因为安装Visual Studio 2013或者2012版本的时候,会自动安 ...