蓝桥杯 历届试题 小朋友排队

问题 E: 起止位置(C++)(二分查找) 王老师想要查询,年龄为x的同学,在队伍中首次出现的位置和最后一次出现的位置;如果队伍中不存在年龄为x的同学,请输出-1。请注意:本题中王老师查询年龄x出现的起止位置,并不是查询了1次,而是查询了q次。共q行,每行包含两个整数,表示所求年龄在队伍中的起始位置和终止位置。年龄为8的同学首次和最后一次出现的位置分别是:-1 -1;年龄为2的同学首次和最后一次出现的位置分别是:2 4;年龄为1的同学首次和最后一次出现的位置分别是:1 1;年龄为3的同学首次和最后一次出现的位置分别是:5 6; 阅读详情
  历届试题 小朋友排队  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  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。

在这一题里我也卡了一段时间

一开始我单纯的一位是排序题采用冒泡排序解决

然后写了一套排序解决方案

然后样例数据通过后进行提交发现只通过了前三个数据


并且6-10题都是运行超时

后来查询网上一些其他大神的资料发现冒泡排序在这一题里并不能有不开心数的最小值

而且因为排序需要遍历两次在题目要求中的1000000这么大的数据里循环两次必然会运行超时

后来查询资料得知这一题不开心值的解决方案最小值求法是找逆序对

使用样例数据中的例子来打比方

输入数据是 3 2 1

要从小到大排列则3至少要交换两次【因为3后面有两个数比它小,即3与2 必然交换一次,3与1也必然交换一次】

要排列2也至少交换两次【因为2前面有一个数3比它大,后面有一个数1比它小】

排列1也是至少交换两次【因为1前面有两个数比它大】

以此类推,可以得知每一个数要交换的次数为这个数前面比它大的数+后面比它小的数,即逆序对数

知道这一个规律后使用for循环也可以求出这些值,但是至少也需要两轮for循环来遍历每一个数

在题目的最大数据规模里,必然会运行超时

因此不能使用for循环遍历每个数来求最小交换次数

后来看别人的解法还有查询资料得知有一种快速求前面所有数的和的方法叫做树状数组

树状数组具体理解可以看这一篇大神的博文https://www.cnblogs.com/ECJTUACM-873284962/p/6380245.html

我这里不详细讲解树状数组的实现等,只讲解解法和功效

树状数组常用于区间查询任意两位元素之间所有元素之和

在此题中可以采用这种方法快速求逆序对

首先用这种方法存储所录入的身高数据

设正在录入的身高为x,然后将c[x+1]=c[x+1]+1(数组c的初始值为0,这一种存储方法可以想象为这一群不同身高的学生,老师叫他们按照身高站,身高为x的学生统一站到x+1群里,则有几个身高为x的学生,c[x]就等于几.)【为什么要x+1?因为树状数组操作空间是1~正无穷,而题目中可能的身高值里有0】

用这种方法存储身高,只要得知c[1]~c[x+1]的和,就能知道前面有多少人比自己矮【虽然这个是顺序的,我们需要获得的是逆序对,但是获取到这个数据也是有用的】

要知道前面有多少人比自己高则可以这样子求,已经录入的数据值-当前身高的值的人数-比当前身高矮的人数【比如总共需要录入n个数据,现在在录第i个数据,身高为x,则n-i-c[x+1]就是比自己高的人数】,即已经录入的人数减去比自己高的和自己一样高的人的人数,剩余的人数就是比自己矮的。

然后需要的数据为后面录入的人里比自己矮的人数,这个可以采用一样的方法,先重置c数组,然后逆序进行重新录入。【此处重新录入是需要把第一次录入的值存储下来,即一开始输入数据为3 2 1 ,逆序录入时录入 1 2 3 】,然后在此时需要的是获取到比自己矮的人数,当前录入身高为x,想知道多少比自己矮可以直接获取c[1]~c[x+1]的和。

具体代码如下

#include<iostream>
#include<cstring>
using namespace std;
//a为原数组,b为按大小排序的数组,c为b的树状数组,d为暂存的不开心值 ,e为等差数列存储不高兴值的递增值
int a[100001],b[1000003],c[1000003],d[1000003];
long long int e[100002];
//位运算
int lowbit(int x)
{
    return x&(-x);  
}
//定义修改C数组的函数,第一个值代表数组位置,第二个代表数组值,在此题中只需默认加一
void update(int local,int num){
	int n=local,add;
	add=num-b[local];
	b[local]=num;
	while(n<1000002){
		c[n]+=add;
		n+=lowbit(n);
	}
}
//查询前多少区间的和
int read(int i){
	int n=i,sum=0;
	while(n!=0){
		sum+=c[n];
		n-=lowbit(n);
	}
	return sum;
}
//清零函数
void ini(){
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
}
int main(){
	int i,n;
	long long int sum=0;
	cin>>n;
	ini();
	for(i=0;i<n;i++){
		cin>>a[i];//按顺序存储进来的小朋友身高
		update(a[i]+1,b[a[i]+1]+1);//修改b和c数组,
		d[i]=i-read(a[i])-b[a[i]+1]+1;//计算在第i个小朋友进来时,前面比他高的人数
	}
	ini();
	for(i=n-1;i>=0;i--){
		update(a[i]+1,b[a[i]+1]+1);//修改b和c数组,
		d[i]+=read(a[i]);//计算在第i个小朋友进来时,后面比他矮的人数
	}
	e[1]=1;
	for(i=2;i<n+1;i++){
		e[i]=e[i-1]+i;
	}
	for(i=0;i<n;i++){
		sum+=e[d[i]];
	}
	cout<<sum;
	return 0;
}

里面需要注意的是一些地方因为数据过大超过了int 存储范围

第一处是总不开心值sum,这里不采用long long int的话可能会超出数据范围导致无法通过样例数据【这里的报错包括下面的那个没有用long long int 的错误】


另一处需要用long long int的地方是

long long int e[100002];

这里引起的报错是


这个数组是我用来存储不开心值的等差数列,即当小朋友交换一次时不开心值为1则e[1]=1,交换两次不开心值为1+2即e[2]=e[1]+2=3,虽然可以使用等差数列求和公式来快速获取最后值,但是考虑到交换次数可能重复,所以采用数组存储具体值,避免计算使用消耗内存。【虽然好像因为里面有很多多余的计算也消耗了很多内存。。。】

总结经验是对于大规模数据运算,对于不确定数据规模会不会过大时要记得用long long int,不然找bug找半天

其实经验是学习快速区间求值的方法是树状数组 

蓝桥杯第5届第10题 标题:小朋友排队     n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。     每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。     如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k 阅读详情

相关推荐

[蓝桥杯][历届试题]小朋友排队--树状数组

** [蓝桥杯][历届试题]小朋友排队 ** 时间限制: 1Sec 内存限制: 128MB 提交: 1499 解决: 240 题目描述 n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。 如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不...

rwrsgg的博客 231

蓝桥杯——小朋友排队(归并 + 树状数组)

原题链接:小朋友排队 题目描述 nnn 个小朋友站成一排。 现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。 开始的时候,所有小朋友的不高兴程度都是 0。0。0。 如果某个小朋友第一次被要求交换,则他的不高兴程度增加 111,如果第二次要求他交换,则他的不高兴程度增加 222(即不高兴程度为 333),依次类推。当要求某个小朋友第 kkk 次交换时,他的不高兴程度增加 kkk。 请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。

Archerrrrr的博客 523

蓝桥杯 - 历届试题 小朋友排队 C语言实现

历届试题 小朋友排队 时间限制:1.0s   内存限制:256.0MB   问题描述   n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。   每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。   如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加

zhencan的博客 5497

蓝桥杯·小朋友排队问题 Python题解整理(归并排序+树状数组)

原题: 思路: 其实就是关于逆序对的问题。每个小朋友的不高兴程度是以其交换次数为等差数列的和(an=n),而每个小朋友的交换次数则取决于(排在他前面还比他高的人)+(排在他后面还比他矮的人)。 方法: 最简单的用暴力遍历,但TLE时间受限。 这里可以考虑归并排序和树状数组,时间复杂度都是 O(nlogn) 题解: 1.归并排序+二分 思路参考:数据结构--归并排序的应用(求逆序数 蓝桥杯--小朋友排队) - ruo_yu - 博客园 def merge(a,l,r):..

UESTCYYDS的博客 2901

5G NR 帧结构

本节主要介绍5G NR中的帧结构[38.211-4.3]。5G帧结构(Frame Structure)为时域结构。其设计比其4G LTE更为灵活,这种灵活性使5G能够根据应用需求(如增强移动宽带eMBB,超高可靠低时延通信URLLC)进行调整,同时支持差异化的应用场景,提高了5G的利用效率与响应能力。具体而言,5G帧结构是基于时隙和OFDM符号设计的,且5G网络能够根据服务需求动态调整各时隙持续时长。

夫子喵的博客 5286

经典脉冲激光测距原理&雷达方程

脉冲激光测距机的工作过程如下:首先用瞄准光学系统瞄准目标,然后接通激光电源,储能电容器充电,产生触发闪光灯的触发脉冲,闪光灯点亮,激光器受激辐射,从输出反射镜发射出一个前沿陡峭、峰值功率高的激光脉冲,通过发射光学系统压缩光束发射角后射向目标。通过计算激光发射功率经介质传输的衰减,目标表面截获和反射的光功率,到达接收视场的光功率,以及接收光学系统接收到的光功率,就可以得到到达光电探测器的光功率,即接收功率。⑤光東路程上的折射率变化;),测量光脉冲到达目标并由目标返回到接收机的时间,由此计算出目标的距离。

weixin_46153372的博客 2526

蓝桥杯 历届试题 小朋友排队 C++

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

qq_22627503的博客 2014

麒麟KylinV10系统yum源更换全攻略:从官方源到第三方仓库的保姆级教程

本文详细介绍了麒麟KylinV10系统yum源的更换与优化方法,包括官方源配置、第三方仓库集成及RPM包管理技巧。通过实战案例和命令示例,帮助用户快速解决软件依赖问题,提升系统管理效率。特别适合需要在国产操作系统上进行开发的工程师参考。

weixin_30752699的博客 649

蓝桥杯 历届试题 小朋友排队 python

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

eatanotherapple的博客 1286

关于光耦隔离与SP3485E芯片一起使用无法拉高485使能引脚问题

最近在做的一个项目,定制了一块STM32F407ZG的工控板,工控板载4个485接口全部都是只能接收数据,不能对外发送数据。1.接线不正确:接线不正确导致485收发出现问题。 2.程序端口初始化问题:控制光耦隔离的输入脚IO的初始化和置位状态有问题。 3.GPIO复用问题:控制对应串口的GPIO不是正点原子默认的GPIO,而是经过复用的其他IO,复用问题。 4.程序设置与485E芯片收发模式不对应:对于使能引脚的电平要根据光耦的输出情况确定输入IO与RE的关系,可能模式没有对应。 5.光耦隔离或者SP485

weixin_45862642的博客 2978

小红书x-mini签名逆向实战:Frida动态Hook与算法还原

在移动App协议分析中,请求签名机制是保障接口安全的核心技术,其本质是客户端对请求参数、时间戳、设备指纹等要素进行加密认证的过程。理解签名原理需掌握Native层加密流程、JNI调用机制及密钥动态派生逻辑。Frida作为主流动态插桩工具,能绕过符号剥离、字符串加密和控制流混淆等反分析手段,在函数执行瞬间捕获寄存器状态、内存数据与调用上下文,实现签名算法的完整还原。该技术广泛应用于合规内容监测、API自动化调用与竞品协议研究等工程场景。本文聚焦小红书x-mini签名这一典型样本,详解从JNI_OnLoad定位

weixin_31264565的博客 461

Java实现 蓝桥杯 历届试题 小朋友排队

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

南 墙 1万+

SMRATS(一) SMARTS+PPO baseline运行教程

python类方法 class Agent: @classmethod def from_function() python typing 含义 为防止弱类型python出现忘记变量类型的问题,python3.5及之后版本增加了对应的类型提示。 输入和输出类型 函数接受并返回一个字符串,注释像下面这样: def greeting(name: str) -> str: return 'Hello ' + name 常用的typing类型 int,long,float: 整型,

Freshduke的博客 1415

蓝桥杯历届试题之小朋友排队

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

try_fei_ge的博客 9381

多模态脑区细分图谱 HCP-MMP v1.0, Glasser et al. 2016 皮层和皮下区域,简写和全称对应关系

人类连接组计划多模态脑区细分图谱(HCP-MMP)提供了对人类大脑皮层区域的非常有用的细分(Glasser et al. 2016a, b)。图谱是多模态的,因为每个区域都是根据四个标准的组合定义的,包括结构(T1加权/T2加权髓鞘含量和皮层厚度图)、静息态功能连接、基于任务的激活和拓扑地形组织。HCP-MMP v1.0图谱包含每个半球180个皮层区域,基于210名参与者的分析。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2622

把 SAP GUI 做成可维护的应用:Module Pool 基础与 Table Control 深入实战

SAP Module Pool 与 Table Control 开发要点 摘要:Module Pool 作为 SAP GUI 交互的核心技术,由程序、屏幕(Dynpro)和流逻辑(Flow Logic)组成,通过 PBO/PAI 事件驱动数据流。Table Control 是其中处理多行数据的核心控件,其开发关键在于: 正确理解 PBO/PAI 数据流机制 掌握 CXTAB_CONTROL 结构的关键属性(LINES、TOP_LINE 等) 合理设置列控制属性(CXTAB_COLUMN) 采用 LOOP W

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

蓝桥杯历届试题-小朋友排队

(树状数组 java)每次只能交换相邻位置的两个小朋友,也就是说这个小朋友肯定会跟前面身高高的小朋友和跟后面身高底的小朋友交换.又因为其满足单点修改会不断有小朋友加入区间和区间查询查询区间的综合的特征,所以可以用树状数组来做.(如果用双重for遍历肯定会超时)如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友再交换身高为2和1的小朋友每个小朋友的不高兴程度都是3,总和为9

wlkq的博客 497

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝桥杯小朋友排队java_蓝桥杯 历届试题 小朋友排队

标签:历届试题 小朋友排队时间限制:1.0s 内存限制:256.0MB问题描述n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋...

weixin_33037713的博客 313

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【蓝桥杯】 历届试题 小朋友排队(树状数组)

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

酱懵静的博客 3305

题目 1439: [蓝桥杯][历届试题]小朋友排队

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

Esaka 1898

[蓝桥杯][历届试题]小朋友排队

时间限制: 1Sec 内存限制: 128MB 提交: 75 解决: 11 题目描述 n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2...

113

题目 1439: 蓝桥杯历届试题-小朋友排队

题目 1439: 蓝桥杯历届试题-小朋友排队 旧题新做,总有不一样的感觉。 不只是会忘记,温故仍可知新。 很简单的题。 用两次树状数组即可。 需要求前面有多少个比它大的,后面有多少个比它小的。 前面比他大的就是逆序对。以往都是数据离散化求,这个题可以不用离散化,因为身高最大才1e6.求逆序对,前 i 个数(包括第i个数)可以和第i个数组成 i 个顺序对或者是逆序对,或者相等。所以,query(a[i]-1)是之前求逆序对,是因为query(a[i])也包含了自己即求了相等对。所以query(a[i])包括了

qq_45895217的博客 1074
上一篇: 蓝桥杯 格子刷油漆
下一篇: C语言中关于获取EOF的坑
blankcyx
博客等级 码龄10年 4粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值