热门标签 | 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];//将排序好的类对象数组传给原类对象数组
}

}
}




推荐阅读
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 通过采用用户数据报协议(UDP),本研究设计并实现了一种高效的文件传输方法。在发送端,系统利用Java编程语言中的相关类库,如`File`和`FileInputStream`,实现了文件的读取与分段处理,确保了数据的快速传输。该方法不仅提高了传输效率,还降低了网络拥塞的风险,适用于大规模文件传输场景。 ... [详细]
  • 捕获并处理用户输入数字时的异常,提供详细的错误提示与指导
    在用户输入数字时,程序能够有效捕获并处理各种异常情况,如非法字符或格式错误,并提供详尽的错误提示和操作指导,确保用户能够准确输入有效的数字数据。通过这种方式,不仅提高了程序的健壮性和用户体验,还减少了因输入错误导致的系统故障。具体实现中,使用了Java的异常处理机制,结合Scanner类进行输入读取和验证,确保了输入的合法性和准确性。 ... [详细]
  • 深入解析 Java UTC 时间处理技术与应用 ... [详细]
  • Java 中 ZonedDateTime 类的天数方法详解及示例代码 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • HDU1176:免费馅饼问题的动态规划解法分析
    题目“免费馅饼”通过动态规划方法进行了解析。该问题的时间限制为 Java 2000ms 和其他语言 1000ms,内存限制为 Java 65536K 和其他语言 32768K。本文详细探讨了如何利用动态规划算法高效求解此问题,并对算法的时间复杂度和空间复杂度进行了深入分析。此外,还提供了具体的实现步骤和代码示例,帮助读者更好地理解和应用这一方法。 ... [详细]
  • Java SE 文件操作类详解与应用
    ### Java SE 文件操作类详解与应用#### 1. File 类##### 1.1 File 类概述File 类是 Java SE 中用于表示文件和目录路径名的对象。它提供了丰富的方法来操作文件和目录,包括创建、删除、重命名文件,以及获取文件属性和信息。通过 File 类,开发者可以轻松地进行文件系统操作,如检查文件是否存在、读取文件内容、列出目录下的文件等。此外,File 类还支持跨平台操作,确保在不同操作系统中的一致性。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 本文深入探讨了Java中正确使用return语句的方法。通过详尽的示例和解释,帮助读者理解return语句在不同场景下的应用,提升代码质量和可读性。希望读者在阅读后能够掌握return语句的最佳实践,从而在实际开发中更加得心应手。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 利用 Spring BeanUtils 实现 JavaBean 的深度克隆与属性复制 ... [详细]
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社区 版权所有