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

问题 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

等保: Postgresql配置ssl链接

等保: postgresql配置ssl链接完整方案和避坑指南

weixin_43557605的博客 4383

【LaTeX】IEEE会议模板中使用BibTex插入文献(解决报错:Something‘s wrong--perhaps a missing \item. \end{thebibliography}

使用IEEE会议论文LaTeX模板时遇到的一个错误,问题描述为:使用Texstudio编译LaTeX模板报错,报错信息提示为。出现的原因为IEEE会议论文模板自带的参考文献引用方式为手动插入,即不使用格式的参考文献,手动将参考文献调整为合适格式,然后粘贴到文本中,我准备将其换成方法引用参考文献。我的替换步骤为删除原始参考文献对应内容,即模板中的: 将以下函数添加到原始参考文献对应位置,对应上文新建的文件。 再次编译出现报错 删除文件夹中的文件 修改模板中的引用名称 引用方法为: 将 替换为 再次编译——

TangPlusHPC的博客 9916

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

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

qq_22627503的博客 2014

ROS 2实战:用MoveIt Task Constructor让机械臂完成抓取任务(附避坑指南)

本文详细介绍了如何在ROS 2环境中使用MoveIt Task Constructor框架,为Franka Panda机械臂构建一个完整的拾取放置任务流水线。通过分解任务阶段、配置规划器并处理实际部署中的常见问题,帮助开发者从基础运动规划升级到可靠的多步骤任务编排,并附有核心避坑指南。

vvv99的博客 508

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

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

eatanotherapple的博客 1286

CTFHUB------XSS反射型(WP)

文章目录前言XSS测试平台 前言 一开始我直接在上面写js脚本发现出错,最后发现只能通过下面的输入框来执行XSS测试,于是我们只能用XSS测试平台解决问题 XSS测试平台 注册一个XSS测试平台 这里随便填写 勾选默认模块就够了,点击下一步 这时会出现一个找个将代码复制 拼接到网站后缀name后面,点击send 这时平台会收到一个记录点开即可 得到flag ...

Y4tacker的博客 1万+

论文翻译:2024 High-Confidence Computing A survey on large language model (LLM) security and privacy: The

大型语言模型(LLMs),如ChatGPT和Bard,已经彻底改变了自然语言理解和生成。它们具有深度语言理解能力、类似人类的文本生成能力、上下文意识和强大的问题解决技能,使它们在各个领域(例如搜索引擎、客户支持、翻译)中变得不可或缺。同时,LLMs也在安全领域获得了关注,揭示了安全漏洞并展示了它们在安全相关任务中的潜力。本文探讨了LLMs与安全性和隐私的交集。具体来说,我们研究了LLMs如何积极影响安全性和隐私,与它们使用相关的潜在风险和威胁,以及LLMs内部的固有漏洞。

CSPhD-winston的博客 1722

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

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

南 墙 1万+

C++ Qt6 QtQuick/QML入门进阶与项目实战视频教程

C++ Qt这些年在PC客户端、嵌入式、汽车座舱仪表等领域应用很广泛,例如剪映专业版、微信4.0、亿图脑图、Steam、美图秀秀、腾讯会议、钉钉(部分模块)等都是使用C++ QWidget/QML开发。特别是QML这种声明式UI开发更加快捷,QML的界面开发效率相对于QWidget更快速,界面效果更好,QtQuick/QML在Qt6版本也逐渐完善了,使用QML进行客户端开发是个不错的选择。

琅嬛福地 4490

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

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

try_fei_ge的博客 9381

华为OD机试真题 C 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

wlkq的博客 497

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

weixin_33037713的博客 313

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

历届试题 小朋友排队 问题描述 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、付费专栏及课程。

余额充值