小朋友排队|2014年蓝桥杯B组题解析第十题-fishers

小朋友排队

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。
资源约定: 峰值内存消耗 < 256M CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。

思路一:求逆序对:左边大于它的 + 右边小于它的数量,求完逆序对后,计算等差数列和 (因为不高兴程度每次增加k)

待改进:只能过50%的数据,超时了。需要用归并排序 和 树状数组改进。

#include<iostream>
using namespace std;int n;
int arr[1000010];
long long ans = 0;/*
求逆序对:左边大于它的 + 右边小于它的数量
求完逆序对后,计算等差数列和 (因为不高兴程度每次增加k)
*/ long long cal(long long x){return x + x*(x-1)/2;
}int main(){cin>>n;for(int i=1;i<=n;i++){cin>>arr[i];}for(int i=1;i<=n;i++){long long ans1 = 0;long long ans2 = 0;for(int j=1;j<i;j++){if(arr[j] > arr[i]){ans1++;}}for(int j=i+1;j<=n;j++){if(arr[j]<arr[i]){ans2++;}}ans+=cal(ans1 + ans2); }cout<<ans<<endl;
}

思路二:使用树状数组优化,求逆序对

    先熟悉树状数组原理及其应用。
    1.这道题可以转换成求每个位置的左边比他小的个数和右边比他大的个数,这两个相加就是这个人要被交换的次数,然后根据等差数列前n项求和公式(a1+an)*n/2,将所有位置和相加即可。

    2.求逆序数用树状数组优化成 nlogm,树状数组是专门用来求前缀和的,这里从位置0遍历到n-1,把高度作为树状数组的下标,每个高度对应的个数作为树状数组的值,对于输入的小朋友高度a[i],在当前小朋友左边&&比当前小朋友a[i]高的总数,就是树状数组s(maxh)-s(a[i])=i+1-s(a[i]),反之同理。
注意事项:
    1.题中a[i]可以等于0,所以要把输入加一,不然在后面计算sum(a[i]-1)处,会越界。

    2.代码中a数组是保存输入,d数组的下标是高度,lr数组是保存位置i的左右逆序总数,maxh是输入的最大值

代码:

#include <iostream>
#include <cstdio>
#define _for(i,a,b) for(int i=a;i<b;i++)
#define _unfor(i,a,b) for(int i=a;i>=b;i--)
#define mset(a,val,n) for(int i=0;i<n;i++)a[i]=val;
#define lowbit(x) (x&(-x))
using namespace std;
typedef long long LL;int a[100005],d[1000005],n,lr[100005],maxh=0;
//tree_arrvoid add(int i,int x){while(i<=maxh+1)d[i]+=x,i+=lowbit(i);}int sum(int i){int res=0;while(i>0)res+=d[i],i-=lowbit(i);return res;}
//
int main(){scanf("%d",&n);_for(i,0,n){scanf("%d",&a[i]);maxh=max(maxh,++a[i]);}_for(i,0,n){add(a[i],1);lr[i]+=i+1-sum(a[i]);}mset(d,0,maxh+5);_unfor(i,n-1,0){add(a[i],1);lr[i]+=sum(a[i]-1);}LL ans=0;_for(i,0,n){LL k=lr[i];ans+=k*(k+1)/2;}cout<<ans<<endl;
}

转载于:https://www.cnblogs.com/fisherss/p/10286608.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学计算机的误解,让人误解的六大专业

原标题&#xff1a;让人误解的六大专业隔行如隔山&#xff0c;很多人喜欢看名字猜专业&#xff0c;所以导致很多大学专业被人误解。其实了解一个专业不能仅仅凭借它的名字&#xff0c;也不能断章取义&#xff0c;只取片面意思。接下来就让我们来了解一下有哪些被人误解的专业吧…

杂项:轮询

ylbtech-杂项&#xff1a;轮询1.返回顶部 1、轮询&#xff08;Polling&#xff09;是一种CPU决策如何提供周边设备服务的方式&#xff0c;又称“程控输出入”&#xff08;Programmed I/O&#xff09;。轮询法的概念是&#xff0c;由CPU定时发出询问&#xff0c;依序询问每一个周…

python类属性的调用方法_问一个关于PYTHON类属性调用方法的问题

def baidu(self): self.APP_ID2180368 self.API_KEYEYAvb2oTaGa9oSNs5S2yx6v self.SECRET_KEYdmgvBELGq9cMvk2uSPqLUaLUpEng02D self.aipAipOcr(self.APP_ID,self.API_KEY,self.SECRET_KEY) #1.这里定义的self.aip 3. 如果 我把这个self.aip定义在__init__(self)里面就不会报错…

js和css实现手机横竖屏预览思路整理

实现效果&#xff0c;如上图。 首先&#xff0c;实现手机页面在PC端预览&#xff0c; 则先在网上找到一个手机的背景图片&#xff0c;算好大概内间距&#xff0c;用来放预览的页面&#xff0c;我这里是给手机预览页面的尺寸按iphone5的尺寸来的&#xff1b; 一个手机页面在这里…

Lambda,会序列化吗?

因此&#xff0c;我一直在思考Tyrus项目所需的增强功能&#xff0c;该功能允许用户广播到跨机器集群连接到URL的客户端子集。 有多种方法可以做到这一点&#xff1b; 但是自从我使用JDK 8以来&#xff0c;这个问题肯定看起来像钉子。 为此&#xff0c;我创建了一个简单的单元测…

thinkphp日志泄漏漏洞_【Windows高危漏洞预警】CVE20200601,影响关键加密功能

一、事件报告2020年伊始&#xff0c;NSA发现了一个影响Microsoft Windows加密功能的严重漏洞(CVE-2020-0601)。证书验证漏洞允许攻击者破坏Windows验证加密信任的方式&#xff0c;并且可以启用远程代码执行。该漏洞会影响Windows 10和Windows Server 2016/2019以及依赖Windows的…

第一章计算机网络概述答案,第一章 计算机网络概述[3]

1-07 试在下列条件下比较电路交换和分组交换。要传送的报文共x(bit)。从源站到目的站共经过k段链路&#xff0c;每段链路的传播时延为d(s)&#xff0c;数据率为b(b/s)。在电路交换时电路的建立时间为S(s)。在分组交换时分组长度为p(bit)&#xff0c;且各结点的排队等待时间可忽…

meta标签的用处详解

meta标签的用处&#xff1a; 用来描述html文档的一个属性。列如作者。日期和时间&#xff0c;网页描述&#xff0c;关键字&#xff0c;页面刷新等。 是文档最基本的元数据 元数据&#xff08;metadata&#xff09;&#xff1a; 用来概括描述数据的一些基本数据 meta 标签的使用…

最小路径算法(Dijkstra算法和Floyd算法)

1.单源点的最短路径问题&#xff1a;给定带权有向图G和源点v&#xff0c;求从v到G中其余各顶点的最短路径。 我们用一个例子来具体说明迪杰斯特拉算法的流程。 定义源点为 0&#xff0c;dist[i]为源点 0 到顶点 i 的最短路径。其过程描述如下&#xff1a; 步骤dist[1]dist[2]di…

react如何监听路由url变化

"componentWillReceiveProps" "shouldComponentUpdate" "componentWillUpdate" "render" "componentDidUpdate" 使用这些生命周期钩子可以监听到路由相同&#xff0c;参数不同的变化&#xff0c;但是监听不到完全不相同的ur…

python 购物车程序_python_购物车程序

#需求1.启动程序后&#xff0c;让用户输入工资&#xff0c;然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后&#xff0c;检测余额是否够&#xff0c;够就直接扣款&#xff0c;不够就提醒 4.可随时退出&#xff0c;退出时&#xff0c;打印已购买商品和余额 #…

matlab tsai手眼标定程序代码_标定系列一 | 机器人手眼标定的基础理论分析

旷视MegMaster机器人系列是旷视自主研发的一系列AI智能机器人硬件设备&#xff0c;基于旷视全球领先的人工智能算法及机器人技术&#xff0c;可实现搬运、分拣、托举、存储等功能&#xff0c;被广泛应用于物流仓储、工厂制造等场景。旷视SLAM组主要负责多传感器建图、定位、标定…

Java8中的外观(JavaFX8)

JavaFX8在外观方面进行了一些更改 &#xff0c;其中最相关的是新CSS API &#xff0c;它允许您为控件以及已公开的Skin类创建新CSS属性和伪类。 使用CSS可以改变控件的很多外观&#xff0c;但是CSS只能实现很多功能&#xff0c;而这正是Skin类的用处。从“ UI控件体系结构”快…

600分理科选计算机专业,天津600分左右,计算机或电子信息专业,怎么选院校?...

原标题&#xff1a;天津600分左右&#xff0c;计算机或电子信息专业&#xff0c;怎么选院校&#xff1f;想学计算机或电子信息&#xff0c;一定是偏理选科对吧&#xff01;所谓的换算&#xff0c;是指的高考后出了全天津市不分文理的总排名后&#xff0c;如何换算成相当于天津市…

[TypeScript] Export public types from your library

If youre a library author, its useful to expose your public types as interfaces, to allow your consumers to extend them if needed. For example: To resolve the issues, we can do : // typings.d.tsinterface JQuery {hideChildren(): JQuery } 转载于:https://www.…

详解Asp.Net Core中的Cookies

目录 详解Asp.Net Core中的cookies搞懂cookiesAsp.Net中cookies的实现从http中获取cookies将cookies写入http中总结及感想详解Asp.Net Core中的cookies 搞懂cookies 我之前写过一篇文章来介绍cookies&#xff0c;如果你对cookies不是很了解请移步理解cookies这篇文章&#xff0…

为什么坚持使用JavaScript

由于JavaScript似乎征服了世界&#xff0c;因此与之相关的所有技术&#xff08;例如Node.js&#xff09;也开始兴起。 所有中间语言&#xff0c;包括TypeScript &#xff0c; CoffeeScript &#xff0c; ClojureScript和Google的Dart都已设定为目标&#xff0c;以使其更容易用J…

python tkinter选择路径控件_Python3 Tkinter选择路径功能的实现方法

效果基于Python3。 在自己写小工具的时候因为这个功能纠结了一会儿&#xff0c;这里写个小例子&#xff0c;供有需要的参考。 小例子&#xff0c;就是点击按钮打开路径选择窗口&#xff0c;选择后把值传给Entry输出。 效果预览 这是选择前&#xff1a;选择&#xff1a;选择后&a…

小程序在父组件执行子组件方法,可适用于下拉刷新上拉加载之后执行子组件方法

当父组件引用了子组件的时候&#xff0c;会遇到父组件执行子组件的方法&#xff0c;比如下拉刷新上拉加载等事件只有在页面中才能检测到&#xff0c;但是获取数据的方法在子组件&#xff0c;这时就可以执行子组件方法。 思路很简单&#xff0c;类似于vue中给子组件加ref执行子…

微型计算机接口与技术的交通灯,微机原理及接口技术课程设计交通灯

微机原理及接口技术课程设计交通灯序言十字道口的红绿灯是交通法规的无声命令&#xff0c;是司机和行人的行为准则。十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。当前&#xff0c;国内大多数城市正在采用“自动”红绿交通灯&#xff0c;它具有固定的“红灯—绿灯…