今天小编绝对是过的最苦逼的一下午,整整一下午全浪费在这一个题目上,以至于我现在听到“小朋友”这三字都害怕~

下面给大家分享做本题的心路历程,也希望小伙伴们引以为戒,并积极思考,毕竟要做一个有逼格的IT男,心疼自己两秒~

小朋友排队

问题描述

n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。  每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。  如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。  请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。  如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。

输入格式

输入的第一行包含一个整数n,表示小朋友的个数。  第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。

输出格式

输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。

样例输入

33 2 1

样例输出

9

样例说明

首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。

数据规模和约定

对于10%的数据, 1<=n<=10;  对于30%的数据, 1<=n<=1000;  对于50%的数据, 1<=n<=10000;  对于100%的数据,1<=n<=100000,0<=Hi<=1000000。

就是这道题,我用了整整一下午的时间,大量的时间浪费在眼瞎(审题不准),小伙伴要引以为戒~

先说说错误的做法(不能说错误的做法吧,只是题目的另一种模式的答案):

思路:创建三个数组,一个存放原始数据,一个用于存放小朋友的不高兴指数,另一个数组用于克隆原始数据改变之前的数据,进行比较,其实是按照位置来的,只要是位置上的数据发生改变,就累加这个位置小朋友的不高兴指数。(代码有注释,可以参考)。

认为只要交换位置就可以了,于是就有了洋洋洒洒的写了下面的代码:

小朋友排队不相邻(错误做法)

package 历届题目;import java.util.Scanner;public class 小朋友排队不相邻 {public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt();//表示小朋友的数量 //用于储存小朋友的身高 int a[]=new int[n]; for(int i=0;ia[j]){ int temp=a[i]; a[i]=a[j]; a[j]=temp; } for(int k=0;k<=j;k++){ if(c[k]==a[k]){ continue; }else{ b[k]+=1; count+=b[k]; } } c=a.clone(); } } System.out.println(count); }}结果只有初始数据正确,其他的实验数据不正确~

思路:之后又读了一遍题,才看到相邻两个字,在原来代码基础上进行了略微的修改,使得之前的不相邻的交换,换成了相邻的交换,又开始奋笔疾书写了下面的代码,下面的代码会死循环的情况(尽量避免了,有跳出语句),题目所给的实验数据是正确的,由于考虑的按照位置的不高兴程度来进行累加,而不是按照题目中说的按照小朋友的不高兴指数,进而导致最后的结果错误,想了很久怎么解决这个问题,折磨了我很久,最后终于想到了以前经常用的逆序法,心中豁然开朗~

小朋友排队相邻(错误做法)

package 历届题目;import java.util.Arrays;import java.util.Scanner;public class 小朋友排队相邻 {public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt();//表示小朋友的数量 //用于储存小朋友的身高 int a[]=new int[n]; for(int i=0;ia[i+1]){ int temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; for(int k=i;k<=i+1;k++){ if(c[k]==a[k]){ continue; }else{ b[k]+=1; count+=b[k]; } } c=a.clone(); } System.out.println(Arrays.toString(a));//测试代码 } } System.out.println(Arrays.toString(a));//测试代码 System.out.println(count); }}

小朋友排队相邻逆序法(正解但超时超过了1s)

思路:只要循环检查每个小朋友前面有几个比他高的,后面有几个比他矮的,将两者存放在不同的数组中,两者的和就是这个小朋友需要交换的次数,然后用一个for循环就可以求出这个小朋友的不高兴指数,进而将所有小朋友的不高兴指数进行累加,就可以得到正解,好不容易有了思路,由于思路清晰,很快的将代码完成了,兴致勃勃的提交了代码~一个运行时间超时,调到界面上,生无可恋啊,看来不是一个最优解,只能再努力吧。

package 历届题目;import java.util.Scanner;public class小朋友排队相邻逆法{public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt();//表示小朋友的数量 //用于储存小朋友的身高 int a[]=new int[n]; for(int i=0;ia[j]){ after[i]+=1; } } } sum(before,after,n); } public static void sum(int before[],int after[],int n){ int sum=0; for(int i=0;i

小朋友排队不超时(正解)

已经无力吐槽了,这一天过得,程序员真心累啊~还得用到类和对象,以及内部类~

package 历届题目;import java.util.Scanner;public class 小朋友排队不超时正解 {public static int n; public static person[] Child; public static long result = 0; static class person { public int high; //身高 public long count; //调换次数 public person(int high) { this.high = high; this.count = 0; } } public void mergeSort(person[] A) { if(A.length > 1) { person[] leftA = getHalf(A, 0); person[] rightA = getHalf(A, 1); mergeSort(leftA); mergeSort(rightA); Merge(A, leftA, rightA); } } public person[] getHalf(person[] A, int judge) { int len = A.length; person[] half; if(judge == 0) { half = new person[len / 2]; for(int i = 0;i < half.length;i++) half[i] = A[i]; } else { half = new person[len - len / 2]; for(int i = 0;i < half.length;i++) half[i] = A[len / 2 + i]; } return half; } public void Merge(person[] A, person[] leftA, person[] rightA) { int i = 0, j = 0; int lenL = leftA.length, lenR = rightA.length; while(i < lenL && j < lenR) { //计算leftA中大于rightA[j]的元素个数 if(leftA[i].high > rightA[j].high) { rightA[j].count += (lenL - i); j++; } else { i++; } } i = lenL - 1; j = lenR - 1; while(i >= 0 && j >= 0) { //计算rightA中小于leftA[i]的元素个数 if(leftA[i].high > rightA[j].high) { leftA[i].count += (j + 1); i--; } else { j--; } } //进行归并排序,从小到大排序 i = 0; j = 0; int t = 0; while(i < lenL && j < lenR) { if(leftA[i].high < rightA[j].high) A[t++] = leftA[i++]; else A[t++] = rightA[j++]; } while(i < lenL) A[t++] = leftA[i++]; while(j < lenR) A[t++] = rightA[j++]; } public static void main(String[] args) { 小朋友排队不超时正解 test = new 小朋友排队不超时正解(); Scanner in = new Scanner(System.in); n = in.nextInt(); Child = new person[n]; for(int i = 0;i < n;i++) { int high = in.nextInt(); Child[i] = new person(high); } test.mergeSort(Child); for(int i = 0;i < n;i++) { long count = Child[i].count; result += count * (count + 1) / 2; } System.out.println(result); }}

坚持到感动自己~

总结:

成功的路上并不拥挤,因为懂得坚持的人不多~

今天这一天是值得的,让我学会了坚持~

爱变成的小萝卜头~

java身高排队问题_抓狂的java之小朋友排队相关推荐

  1. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  2. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  3. 支持java虚拟主机_为何缺乏支持Java的虚拟主机

    现在很多站长们,都青睐于香港虚拟主机建站.现在常见的是asp和PHP的程序空间很多,但是Java的少之又少,下面小编我给大家聊一聊! 一.香港Java虚拟主机成本高 使用Java程序建站,就必须要用支 ...

  4. java future用法_纯干货:Java学习过程中的21个知识点和技术点

    我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...

  5. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  6. 我的世java途径错误_我的世界JAVA路径错误的解决方法分享

    我的世界JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?第一手游网必须 ...

  7. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”

    赋值运算符是双目运算符,用在赋值表达式中.赋值运算符将值存储在运算符左边操作数指定的变量中.有两种赋值操作,简单赋值和复合赋值,简单赋值把运算符右边的操作数的值存储在运算符左边操作数指定的变量中:复合 ...

  8. java session使用_使用Neo4j和Java进行大数据分析 第2部分

    本文的第一部分介绍了Neo4j及其Cypher查询语言.如果您已经阅读了第1部分,那么您已经了解了为什么Neo4j和其他图形数据库特别受社交图形或网络中用户之间关系建模的影响.您还在开发环境中安装了N ...

  9. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

最新文章

  1. Android 曲线动画animation,类似加入购物车动画
  2. java中Collections.sort排序详解
  3. java entries_Java leveldb遍历特定前缀的entries
  4. 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
  5. sql语句中时间格式转化举例
  6. Android开发之Git提交Template模板配置
  7. 中国还有一个作家叫格非
  8. php强类型 vscode,VSCode + WSL 2 + Ruby环境搭建图文详解
  9. 多个css样式合并到一个“目录”css文件中
  10. 苹果cms V8 M1938蓝色自适应模板
  11. 大数据学习笔记43:Hive - JDBC编程
  12. 【java集合框架源码剖析系列】java源码剖析之ArrayList
  13. 金三银四,Android高级开发面试题目,帮你助力
  14. 7号信令: TUP与ISUP的区别
  15. A very hard mathematic problem HDU - 4282(二分)
  16. 介绍3种JavaScript重定向到另一个网页的方法
  17. Python中print函数细节——默认换行
  18. 学计算机高中选那三科,高中选哪三科最吃香
  19. codeblocks无法找到编译器问题的三个原因
  20. 以低功耗蓝牙便携医疗设备帮助改善癫痫患者治疗管理

热门文章

  1. 为什么 1 字节表示的数值范围是 127 ~ -128
  2. slua 是c语言开发的吗,初学者必备文档:LUA新手快速学习笔记
  3. 企业ERP系统开发总结及建议
  4. js数据类型转换(5)
  5. 堆及堆排序(超超超超超详细讲解~~~~)-----数据结构
  6. 盘点史上最危险的10种创业合伙人
  7. vue3 + element plus 使用el-button焦点问题 失焦操作
  8. cmake:通过CMAKE_CXX_COMPILE_FEATURES判断编译器是否支持C++11
  9. 【Shell】mksh运行分析
  10. 4. 频域处理(上)