热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

蓝桥杯小朋友排队JAVA

问题描述n个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。每个小朋友都有一个不高兴的程度
问题描述
  n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。

  每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。

  如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。

  请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。

  如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。
输入格式
  输入的第一行包含一个整数n,表示小朋友的个数。
  第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。
输出格式
  输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。
样例输入
3
3 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。

该问题的解法有两种

一:归并排序

归并排序的特点非常符合本题,本题要求只能相邻的元素相互交换,而归并排序本质排序也是这样;具体怎么解,看下边的代码,本人小白一个,参加了这次的java蓝桥杯,遇到这个题后,不知道如何解答,在网上搜到的大多是c/c++,搜到的java写的也大多有错误,写了好久总是不对,还以为本题无法用java写出,终于写出来了 哈哈  功夫不负有心人,注释中的数组都是值得对象数组,元素也是对象元素;

二:树状数组(不太了解这块,所以不说了)

import java.util.*;public class Main {

/**
* @param args
*/

public static class num //内部类
{
public long h;//用long,否则会出错
public long t;//用long,否则会出错
}
static num num1[]=new num[100001];//一开始开了100005个,但是造成了有一组测试数据超时
static num num2[]=new num[100001];//
public static void main(String[] args) {

for(int i=0;i<100001;i++)//对内部类对象初始化
{
num1[i]=new num();
num2[i]=new num();
}
Scanner input=new Scanner(System.in);
int n=input.nextInt();
for(int j=0;j {
num1[j].h=input.nextInt();
}
merge(num1,0,n-1);
long sum=0;//必须用long,否则会错误
for(int k=0;k {
//System.out.println(num1[k].h+" "+num1[k].t);
sum+=(num1[k].t*(num1[k].t+1))/2;//等差数列求和公示
}

System.out.println(sum);
}
public static void merge(num a[],int left,int right)
{
if(left==right) //终止递归的条件
{
return;
}
int mid=(left+right)/2;
merge(a,left,mid);
merge(a,mid+1,right);
int p=left;
int q=mid+1;
int i=left;
while(p<=mid && q<=right)
{
if(a[p].h>a[q].h)
{
a[q].t+=mid+1-p;//如果左数组第一个元素比右数组第一个元素大,因为左右数组都是从小到大排序的
//所以左数组所有的元素(mid+1-p个)都大于右数组第一个元素;
num2[i++]=a[q++];//注意这里交换的是类对象,这是归并排序的核心知识

}
else
{
a[p].t+=q-1-mid;//左数组的第一个元素小于或者等于右数组的第一个元素,q-1-mid==0,在右数组中,q所指的元素前面的元素就是小于p所指的元素,q-1-mid就是q所指元素的前边元素的个数;
num2[i++]=a[p++];
}
}
while(q<=right)//右数组有剩余,说明左数组的元素都比右数组剩下的元素小
{
num2[i++]=a[q++];
}
q--;//在前边判断循环终止时q=last+1,所以循环终止,所以这里需要减去1
while(p<=mid)
{
a[p].t+=q-mid;
num2[i++]=a[p++];
}


int j=left;
for(;j<=right;j++)
{
a[j]=num2[j];//将排序好的类对象数组传给原类对象数组
}

}
}




推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
tanhuixi135_414
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有