目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述
  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。

2 解决方案

具体代码如下:

import java.util.Scanner;

public class Main {
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) {
Main test = new Main();
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);
}
}

算法笔记_171:历届试题 小朋友排队(Java)的更多相关文章

  1. 算法笔记_177:历届试题 城市建设(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有 ...

  2. 算法笔记_186:历届试题 高僧斗法(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地 ...

  3. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

  4. 算法笔记_172:历届试题 波动数列(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...

  5. 算法笔记_170:历届试题 分糖果(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后 ...

  6. 算法笔记_196:历届试题 剪格子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|**** ...

  7. 算法笔记_195:历届试题 错误票据(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为 ...

  8. 算法笔记_194:历届试题 翻硬币(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情 ...

  9. 算法笔记_190:历届试题 幸运数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成 . 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第 ...

随机推荐

  1. php安装配置

    Content 0.序 1.安装前准备 2.安装PHP 3.配置php-fpm 0.序 本文主要是记录php在 Centos下的安装配置 .文中如无特别说明.表示php-5.6.31代码目录. 1.安 ...

  2. Git_自定义Git

    在安装Git一节中,我们已经配置了user.name和user.email,实际上,Git还有很多可配置项. 比如,让Git显示颜色,会让命令输出看起来更醒目: $ git config --glob ...

  3. 正确率、召回率和F值

    正确率.召回率和F值是在鱼龙混杂的环境中,选出目标的重要评价指标. 不妨看看这些指标的定义先: 正确率 = 正确识别的个体总数 /  识别出的个体总数 召回率 = 正确识别的个体总数 /  测试集中存 ...

  4. SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】

    今天运行壹個小程序,功能是读取指定目录下的 SQL 脚本,并加载到内存中批量执行,之前的程序运行良好.但是今天相关开发人员更新了其中壹個 SQL 脚本,于是程序运行的时候就出错了,错误提示信息如下:批 ...

  5. HDU 2604 Queuing 矩阵高速幂

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. MultipartFile+nio上传文件

    import java.io.File;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths; ...

  7. CAShapeLayer的path动画

    CAShapeLayer的path动画 效果 源码 https://github.com/YouXianMing/Animations // // CAShapeLayerPathController ...

  8. Ganglia开源集群监视项目

    Ganglia是UC Berkeley发起的一个开源集群监视项目,设计用于测量数以千计的节点.Ganglia的核心包含gmond.gmetad以及一个Web前端.主要 是用来监控系统性能,如:cpu ...

  9. OpenCV学习(18) 细化算法(6)

    本章我们在学习一下基于索引表的细化算法. 假设要处理的图像为二值图,前景值为1,背景值为0. 索引表细化算法使用下面的8邻域表示法: 一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示 ...

  10. pat 1060 比较科学计数法

    trick: 1.前导0 如:000001,000.000001 2.出现0时也要按照科学计数法输出 e.g. 4 00000.00000 0001 NO 0.0000*10^0 0.1*10^1 3 ...