LoadRunner 压测场景制定以及报告分析
这里,我们利用 LoadRunner 来制定场景,且以测试 tps 值为导向,主要介绍手工场景
单服务器的业务请求处理能力 tps 值在 10~200 是合理的;如果是访问单接口不走关系型数据库的,访问的是 redis (内存里面读)那么 tps 在 1000~2000 左右是合理的
单负载机的最大并发多少?不管是 LR 和 JMeter,10~4000 是合理的
如果要测试响应时间或者是说并发,是要有前提条件的:比如说并发为 100 的响应时间为 XX,响应时间为 1 s 支持的最大并发量为 XX。所以说 tps 值是一个最普遍的值,1s 处理的事务数。
前提:准备好没问题的脚本以及数据,负载机等
进入压测场景的方式有两种,这里,我们示范两种方式的进入手工设定场景
1、直接进入 Run Load Tests
2、从脚本显示页进入
Controller-Scenario
性能测试有三个场景需要测试:单场景,混合场景,稳定性测试场景
Design
Scenario Groups 基本设置
这一部分主要的功能是选择进行压测的脚本
- Group Name ## 脚本名称
- Script Path ## 脚本路径
- Quantity ## 最大 Vu 数
- Load Generators ## 脚本压测选择的负载机
如果我们这里只选择一个脚本,那么就是单场景压测,如果需要跑混合场景,那么就得增加 Group
修改页面如下:Group Name不重要,可以手动修改,执行的是 Script Path 内的脚本
如果我们选择 1 个以上的脚本进行并发,那么就是混合场景:
修改脚本的 Quantity
Quatity这里比较特殊,不能直接修改,我们需要选中脚本,点击 "Virtual Users" ,再去选择添加的虚拟户数
并且可以针对每个 Vu ,选择不同的负载机
分布式负载设置
那么,怎么添加负载机,做分布式负载呢?(两种方式)
添加好负载机还得将脚本连接好负载机:
负载机不需要安装完整的 LoadRunner,只需要安装 LoadRunner 的 Generator 模块,并且正在运行
连接好负载机后,如果负载机在 Windows 上,会有个小云朵的图标,代表连接上了该负载机
压测内修改脚本以及更新 Run-time Settngs
并且可以修改 RunTime-Setting / Scripts:修改完脚本或者 RunTime-Setting 需要点击 "Refresh",选择更新脚本或者是 setting
这样第一部分的 Senario Group 就基本设置完成。
Scenario Schedule
A. 定义方案schedule
在 Scenario Schedule面板中,选择一个方案schedule,或通过点击New Schedule定义一个新的方案
group:多个脚本之间按照独立设置模式跑,各个脚本可以单独设置虚拟用户、运行时间等
scenario:多个脚本之间按照相同的模式跑,将总的虚拟用户数按照一定的比例分配给各个脚本
定义schedule:
- 新建schedule:点击新建按钮(可选)
- 重命名schedule:在 Schedule Name 输入新的名字并点击Save New Name(可选).
- 选择schedule类型,Schedule by: Scenario 或 Group.
- 选择运行模式Run mode: Real-world 或Basic
说明:
1.对所有schedule默认的运行模式都是Real-word.你可以改变缺省模式为Basic。Tools > Options > Execution tab
2. Schedule by Scenario和Group的区别
Real-world Schedule和Basic schedule的区别:根据官方文档,这两种模式下,场景中的每个虚拟用户组(可看成是每个脚本)都会按照它们自己的Run-Time settings中的设置运行。区别在于可模拟的操作不一样:
Schedule by:Scenario
Basic Schedule:可以定义每次运行多少用户,场景持续运行多久
Real-world Schedule:同Basic schedule,除此之外,还可以设置每次停止多少个用户。
Schedule by:Group(该设置在百分比模式下不可见)
Basic schedule:可以定义什么时候开始运行虚拟用户组(Group和Scenario的主要区别),每次运行多少个虚拟用户,场景持续运行多久
Real-world Schedule:同Basic Schedule,除此之外,还可以设置每次停止多少个虚拟用户。
双击Group Schedule下的Start Group Action,打开Start Group策略,设置脚本在手工场景下的Group模式中如何开始运行
B. 为schedule定义action(Global schedule)
Actions表格展示了默认的与步骤2选择的shedule对应的actions。
Schedule Actions.
一个场景schedule包含了一系列actions,指导场景什么时候运行Vuser group,怎么初始化虚拟用户,合适开始和停止虚拟用户,及运行一个action要花的时间。
注意:脚本中带集合点会妨碍场景方案的运行。如果有包含集合点,场景可能不会按照你设定的方案运行。
说明:
1) Start Group
定义何时开始运行Vuser Group
1、Start immediately after the scenario begins(缺省)
LoadRunner在场景一运行就开始运行Vuser Group
2、Start <00:00:00> (HH:MM:SS) after the scenario begins
场景运行后,LoadRunner等待指定的时间后开始运行Vuser group.
3、Start when group finishes
指定Vuser group运行完成后,LoadRunner马上开始运行该Vuser group.
注意:Start Group仅在group schedule类型中可用,而且总是作为第一个action出现.
2) Initialize
指导LoadRunner准备Vusers,以便于他们处于准备运行状态.
1、Initialize all Vusers simultaneously
在LoadRunner在运行vuser前初始化所有Vusers.
注意:选择该设置可能会导致运行出错:error-27796 failed to connect to server
2、Initialize XX Vusers every <00:00:00> (HH:MM:SS)
LoadRunner在运行vuser前,根据指定的时间间隔,逐渐初始指定数量的Vuser,
3、Initialize each Vuser just before it runs(Default)
LoadRunner在运行它们前初始化每一个Vuser
注意:当Wait for all groups to initialize选项被选中时,必须等所有的Vuser group完成对虚拟用户的初始化后才运行
该选项对于group scenario不可用
3) Start Vusers
指示loadRunner开始运行Vusers。
1、Start XX Vusers: Simultaneously(Default)
指定LoadRunner运行场景的虚拟用户总数
2、Start XX Vusers: YY Vusers every <00:00:00> (HH:MM:SS)
LoadRunner按指定的时间间隔,逐步运行指定数量XX个Vusers,也就是说LoadRunner运行指定数量的一组Vusers,并且等待指定时间后运行指定下一组Vuser.
3、点击Previous 或Next可切换其它要编辑的action.
注意:
1.当且仅当Vuser处于Ready状态时,LoadRunner才开始运行Vuser.
2.Basic运行模式下默认运行所有用户
4) Duration
持续时间
Real-world schedule
Basic schedule
1、Run until completion
按Controller中Run-time settings -> logic中的迭代次数进行迭代,迭代完成则停止运行。
2、Run for x days and xx:xx:xx
忽略Run-time settings -> logic中设置的迭代次数,重复迭代运行脚本的action,直到时间结束为止, 也就是说,此处设置的持续时间的优先级高,
也就是说:
- 即使你指定了迭代次数,但是运行时间没有结束之前,还是会一直迭代,所以实际迭代次数可能大于你设置的迭代次数;
- 还有一种情况是,迭代次数还没完,但是运行时间已经到了,此时会将当前执行的Action执行完,停止迭代,此种情况下实际迭代次数小于你设置的迭代次数。
3、Run indefinitely
无限运行
C. 从Actions表格中添加一个action到schedule
步骤1:打开添加Action对话框
方法1、在指定action后插入一个action,选择这个action并点击Add Action After
方法2、在最后一个action后添加一个action,在Action表格中双击最后一行
步骤2:在Add Action对话框中,定义新的action
注意:这里的Start Vuser数量的设置,会改变上方的组或脚本的虚拟用户数量Quatity
步骤3:点击Apply.
步骤4:继续添加另一个action,点击Add Another Action并重复步骤2,3
Schedule by:Scenario
如果是测试 tps ,Start Vu 和 Stop Vu直接选 "Simultaneously" 即可,因为测试 tps 是先看 1 个 Vu,是多少;2 个 Vu,是多少……等到 tps 上升值很小,就可以考虑用热启动方式去验证一下,顺便截图写报告
1、Initialize
初始化:把用户的进程或者是线程准备好,但是并不运行
我们这里可以极端点,直接选第一个
2、Start Vuers——设置启动用户
这里可以设置 Vu ,指的是这个压测场景所有的用户,比如说我们设置 100,上面的也会被更改掉
如果选择 "Simultaneously",代表所有的 Vu 同时启动,效果如图示(冷启动)
如果 Vu 太多,建议还是这种方式直接起来,时间太宝贵,等?谁等?
我们也可以选择让 Vu 阶段性上升,同时设置其上升的时间,比如说,每 3 min 增加 5 个 Vu ,效果如图(热启动)
3、Duration——持续时间
很容易理解,就是指到达最大 Vu ,继续保持的时间多长,我们如果测试 tps ,这里设置 10~15 min就行
4、Stop Vusers
和 Start Vuers 一样,代表关闭的线程/Vu,这里直接 Simultaneously 就好了,直接退
Schedule by:Group
Group 模式,我们加进一个其他脚本,我们发现 Group 相对于 Scenario 多了一个:Start Group
这个代表可以多场景分组运行
例如,我们让两个场景排顺序进行:
而且,Group 模式下,每个脚本的 Vu 是可以自己设定的:
Global-Oriented Scenario——面向目标的场景设计
不同的是,面向目标的负载机需要手动添加,即使是本机的
重点说下下面的区别:
我们进入 "Edit Scenario Global" 看看,可以看到目标分为五种
目标可以分为五种
- VUser
- pages per minute
- transaction per second
- hits per second
- trasaction response time
Virtual Users Goal:
如果需要测试多少人可以同时运行Web应用,那么推荐定义Virtual Users Goal. 运行定义该目标类型的场景和运行Manual 类型的场景类似。
Hits per Second:
如果想测试Web Server的真正实力,推荐定义目标类型为:Hits per Second,Pages per Minute 或者Transactions per Second,这些类型都需要制定一个虚拟用户的最大值和最小值的范围
Transactions Response Time
如果想知道在多少用户并发访问网站时,事务的响应时间达到性能指标说明书中规定响应时间的最大值,那么推荐使用Transactions Response Time类型,指定需要测试的事务的名称,虚拟用户数量的最大值和最小值,还有预先定义好的事务的响应时间。
我们这里主要看俩:Transaction Per Second & Transactions Response Time
这里,我们用 tps 为例,解释下参数,但是目标为 tps 很少
目标为响应时间支持的用户数,是我们的一个指标。比如我们设置响应时间为 2 s,用户数在 1~150 之间进行尝试,尝试时间为 30 min
Run
Scenario Groups
这里的状态指的是各 Vu 的状态,Vu 其实对应的就是负载机的进程/线程
Vu 状态:
- Down:没有运行
- Pending:挂起
- Init:初始化
- Ready:准备就绪
- Run:正在运行
- Rendezvous:正在集结
- Passed:运行通过
- Failed:运行失败
- Error:出现故障
- Gradual Exting:逐一退出
- Exiting:退出
- Stopped:停止运行
场景控制:
- Star Scenario:运行场景
- Stop:强制停止运行场景
- Rest:将所有选项恢复到默认值
- Vuses:管理虚拟用户
- Run/Stop/ Vuses:启动和停止部分虚拟用户
场景状态:
- Runing Vuses:正在运行的用户数
- Elapsed Time:场景已经运行的时间
- Hits/second:每秒钟点击数
- Passed Transactions:通过的事务数(总事务)
- Failed Transactions:未通过的事务数
- Errors:出现的错误数(失败率不能大于 1%,视公司标准而定。只能将服务器的错误计算进去,不能将负载机的错误计算进去)
注意:Failed Transactions指的是由于事务本身没有缺陷,但由于并发数较多等原因没有连通,而Errors是指事务运行期间产生的缺陷,一般比较严重
接下来是几个视图:常用的视图如下
- Runtime Graphs(运行时图表): 显示运行的虚拟用户、运行时发生的错误、用户自定义数据点信息。
- Transaction Graphs(交易情况图表): 显示交易响应时间以及每秒成功交易的数量、百分比等。
- Web Resource Graphse(网络资源情况图表): 显示每少点击量、吞吐量、每少连接数量等。
- System Resource Graphs(系统资源情况图表):显示Windows、UNIX等不同系统的资源情况等。
- Network Graphs(网络情况图表):显示网络延迟信息。
- Firewalls(防火墙情况图表): 目前只支持某品牌防火墙信息,一般场景基本不会用到。
- Web server Resource Graphs(网络服务器情况图表): 显示多种网站服务器的性能信息,如apache.
- Web application server Graphs(网络应用服务器情况图表):显示多种应用服务器的性能信息,如Weblogic。
- Databases server resource graphs(数据库情况图表): 显示4种主流数据库的性能信息,如DB2、Oracle、SQLServr等,不支持mysql。
- Streaming Media(流媒体情况图表):显示windows media server和Real server以及相应客户端的性能信息。
- 其他类型图表:中间件、CRM/ERP等。
问题:不光是出现了脚本内的事务,还出现了两个无关事务。
解决:把定义每个 action 为事务的选项取消勾选
这里要注意,标准方差不要太大,稳定的话,取这里的平均值就好,如果标准方差 > 8 的话,就看 Analysis 视图内的 90% percent 的响应时间
tps 的 max ,min,Std 都为 NA?这个是正常的,只统计 avg 和 last
Analysis
打开方式:
Summary Report
还可以加 Graph,例如我们加一个 tps 的
Merge:
LoadRunner 的分析页面,图标是可以合并的,假设我们把 RT 和 Vu 表进行合并,就可以知道在哪个用户节点对应的 RT 是多少,更直观地分析性能拐点
操作:
结果:
另外可以截取时间段的结果视图:
对分析有帮助的:
Web Page Diagnostics 模块,但是我这里不知道为啥没有显示
但是我是打开了该功能的:
这玩意的有一个试图叫:Page Download Time Breakdown 是用来分析,我们的时间是花在哪儿了
有以下几个玩意:
DNS Resolution Time :DNS 的解析时间,一般在毫秒级
Connection Time:客户端与服务器进行 tcp/ip 连接所花费的时间,这个长有可能是 tcp/ip 连接数满了,或者说是网络慢
SSL Handshake Time :SSL 建立安全协议的时间,一般在毫秒级
FTP时间
First Buffer Time:服务器处理这个请求以及开始发送第一帧数据的时间,可以理解为服务器的真正业务处理的时间
Receive Time:服务器向客户端发送数据,接收所花费的时间
Client Time:客户端排队的时间
场景运行完后,会分析结果,在HP LoadRunner Analysis 中点击Graph -->Add NewGraph 打开一个新曲线图,open a new Graph ;首先将该曲线图中的右上角的Display only graphscontaining data不选中,然后点击Web Page Diagnostics前的+号,选中Web PageDiagnostics,点击曲线图下方的按钮Open Graph即可以将网页细分图调出。
二、网页细分图介绍
Web Page Diagnostics (以下简称WPD),这是LR Analysis中非常重要的一块,搞清楚这部分的内容会让你少走很多弯路,很多环境问题都可以通过它来定位,比如客户端,网络。通过它可以你可以比较好的来定位是环境的问题还是应用本身的问题,当然更重要的是Web页面本身的问题。
Web Page Diagnostics:页面诊断图,也叫页面分解总图
“页面分解”显示某一具体事务在测试过程的响应情况,进而分析相关的事务运行是否正常。
Web Page Diagnostics视图可以按下面四种方式进行进一步细分:
- Download Time Breaddown(下载时间细分)
- Component Breakdown(Over Time)(组件细分(随时间变化))
- Download Time Breakdown(Over Time)(下载时间细分(随时间变化))
- Time to First Buffer Breakdown(Over Time)(第一次缓冲时间细分(随时间变化))
下面分别说下网页细分图各图表的功能:
网页细分图,总共有8个图表,分别为:
- 页面分解图总(web page Diagnostics)、
- 页面组件细分图(page comporment breakdown)、
- 页面组件细分图(随时间变化)(page comportment breakdown over time)、
- 页面下载时间细分图(page download time breakdown)、
- 页面下载时间细分图(随时间变化)(page download time breakdown over time)、
- 第一次缓冲时间细分图(time to first buffer breakdown)、
- 第一次缓冲时间细分图(随时间变化)(time to first buffer breaddown over time)、
- 已下载组件大小图(Downloaded Component Size)[KB]。
Web Page Diagnostics总图以transaction分析为主,兼顾页面的初步分析。
1、 页面组件细分图(page comporment breakdown):显示每个网页及其组件的平均下载时间(以秒为单位),查看所选择页面中哪个元素所占的平均下载时间最长。
2、 页面组件细分图(随时间变化)(page comportment breakdown over time):此图适合在客户端下载组件较多时的页面分析,通过分析下载时间发现哪些组件不稳定或比较耗时,它是随整个场景运行的时间来变化的。
3、 页面下载时间细分图(page download time breakdown):页面下载时间细分图根据DNS解析时间、连接时间、第一次缓冲时间、SSL握手时间、接收时间、FTP验证时间、客户端时间和错误时间对每个组件进行分析的。它可以确认在网页下载时期,响应时间缓慢是由网络错误引起,还是由服务器错误引起。
4、页面下载时间细分图(随时间变化)(page download time breakdown over time):显示选定网页下载时间细分,从中能看到页面各个元素在压力测试过程中的下载情况。如果某个页面打开速度慢,通过对此图分析,可以清楚地看到打开该页面的时间主要在什么地方,针对此问题进行优化。
5、 第一次缓冲时间细分图(time to first buffer breakdown):指成功收到从web服务器返回的第一次缓冲之前的这一段时间内,每个页面组件的相关服务器和网络时间(以秒为单位);
此图对分析页面的时间很重要,不仅能分析出哪个页面耗费时间较长,而且能分析出之所以耗时是网络问题还是服务器问题。若server time明显大于net work time,并且是其几倍,此时服务器性能是问题关键。
First Buffer Time时间分割为Network Time和Server Time。其中,网络时间(network time)为从客户端发送第一个HTTP请求那一刻直到收到服务端的应答报文(ACK)确认为止所经过的平均时间。服务器时间(server time)是指客户端从收到初始HTTP请求确认直到成功收到来自web服务器的第一次缓冲为止所经过的平均时间。 (后面详细介绍网络时间和服务器时间)
6、 第一次缓冲时间细分图(随时间变化)(time to first buffer breaddown over time):不同页面在任一时间点的Network TIme 和Server Timef分布曲线图;第一次缓冲时间是在客户端与服务器建立连接后,从服务器发送第一个数据包开始计时,数据经过网络传送到客户端后,再到浏览器收到第一个缓冲数据所用的时间。(图中,用两种颜色来区分服务器和网络各自所用的时间,以确认是服务器问题还是网络问题,此图非常有用!)
7、已下载组件大小图(Downloaded Component Size)[KB]:页面中每个元素的大小(KB)
三、页面细分图分析
这里只对页面细分图进一步分析的思路进行梳理,有些图只是拿来参考,并不需要进一步分析的。
1、 首先打开页面分解总图(Web Page Diagnostics),在左边Breakdown Tree下,列出了脚本中添加的所有事务名称,通常来说,我们主要关注需要并发的系统业务部分,来看login部分,下载时间(Download Time)中,主要由两个页面导致,其中Receive部分占用的时间最长。(Component部分不在这里看,因为在这里看不够直观)
2、接着打开页面组件细分图(Page Component Breakdown),找出所选择页面中哪个元素所占的平均下载时间较多,其实就上面的两个,只不过这里是用饼图来展示比较直观。
3、 然后打开页面下载时间细分图(page Download Time Breakdown),根据DNS解析时间、连接时间、第一次缓冲时间、SSL握手时间、接收时间、FTP验证时间、客户端时间和错误时间的组成在所选择的页面上的分布情况,确定这个页面下载时间较长的响应时间是由网络错误引起,还是服务器错误引起的,如图1,Receive Time时间最长,初始判断是网络问题引起的,但也有可能是浏览器请求的问题,再看页面下载细分随时间分布图2,在整个login场景中该页面元素一直在下载?这极有可能是网络问题了。另外一点,若页面缓存做得好,是不会一直下载的吧。
很多时候,你可以根据DNS,Connection,Receive来看出是否存在网络问题,根据Client来判断是否存在客户端问题。
图1
图2
4、 最后打开一个非常重要的图,即第一次缓冲时间细分图(Time to First Buffer Breakdown),第一次缓冲时间细分图进行对比结果是否一致,因为第一次缓冲时间细分图也是可以确定该页面的响应时间是由网络错误引起,还是服务器错误引起。由此图,可以看到,大部分的时间在Network Time。
注意;当网络状况不好的时候,server time很可能包括网络时间,因为很多页面元素比较小(小于4k的样子),在First Buffer就完成传输,所以一定要注意分析。
LoadRunner 压测场景制定以及报告分析的更多相关文章
- Jmeter压测场景及结果分析
1)压力测试分两种场景: 一种是单场景,压一个接口的: 第二种是混合场景,多个有关联的接口. 压测时间,一般场景都运行10-15分钟.如果是疲劳测试,可以压一天或一周,根据实际情况来定. 2)压测设置 ...
- Jmeter(三十六) - 从入门到精通进阶篇 - 设置负载阶梯式压测场景(详解教程)
1.简介 在性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间,然后继续加压达到某个值持续运行,如此循环直到达到预期的峰值,运行一 ...
- [软件测试]网站压测工具Webbench源码分析
一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...
- 网站(Web)压测工具Webbench源码分析
一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...
- loadrunner压测工具
https://www.cnblogs.com/xxyBlogs/p/4579509.html https://www.cnblogs.com/jaazz/p/8668214.html
- 想做iPhoneX抢购活动?压测大师先教你优化网站后台
北京时间9月13日凌晨1点,iPhone 10周年,在Apple Park乔布斯剧院,苹果发布了三款新iPhone.全面屏iPhone X来袭,这款被定义为未来的智能手机黑科技满满:全面屏,无线充电. ...
- JMeter分布式压测实战(2020年清明假期学习笔记)
一.常用压力测试工具对比 简介:目前用的常用测试工具对比 1.loadrunner 性能稳定,压测结果及颗粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多. 2.Apache ab(单接口 ...
- Loadrunner11简单压测接口教程
一.需求 使用Loadrunner压测目标接口,要求支持1000并发数. 目标接口:https://www.xxx.com/digitaldata/api/signer/1.0/signerRegis ...
- 业界压测平台与JMeter的对比
压测平台是什么? 压测,即压力测试,作用是对各种服务对象进行压力测试以获得该服务处于或超过预期负载时系统的运行情况,进而判断系统在峰值负载或超出最大负载情况下的处理能力. 压测工具,顾名思义,就是用来 ...
随机推荐
- SQL-10 获取所有非manager的员工emp_no
题目描述 获取所有非manager的员工emp_noCREATE TABLE `dept_manager` (`dept_no` char(4) NOT NULL,`emp_no` int(11) N ...
- Java作业五
1.编程生成10个1~100之间的随机数,并统计每个数出现的概率. 这个博文里面又random的详细解释:https://www.cnblogs.com/ningvsban/p/3590722.htm ...
- get 和post 请求的写法
get请求 import requests base_url = 'http://httpbin.org' # 定义请求所需的参数,参数之间以英文逗号隔开 param_data = {'} # 发送G ...
- Golang AES加密
package main import ( "crypto/aes" "crypto/cipher" "fmt" "os" ...
- 存在重复元素(python3)
存在重复元素(描述一): 给定一个整数数组,判断是否存在重复元素.如果任何值在数组中出现至少两次,函数返回 true:如果数组中每个元素都不相同,则返回 false. 示例 1: 输入: [1,2,3 ...
- 怪异盒模型和标准盒模型--CSS
一,原理 css 属性:Box Moel分为两种:W3C标准和IE标准盒子模型. 大多数浏览器采用W3C标准模型,而IE中采用Microsoft自己的标准. 怪异模式是“部分浏览器在支持W3C标准的同 ...
- 用纯JS实现,点击一个列表时,输出对应的索引(不能用JQuery哦)
你运行一下代码会发现,无论你点击哪个列表,控制台都是输出10.这是因为var声明的变量是函数作用域的,而不是块级作用域的.也就是说,for循环10次,每次都是改变同一个i,所以它的值会从0一直加到10 ...
- pat--7-11 出栈序列的合法性(25 分)
7-11 出栈序列的合法性(25 分) 给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, ..., N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?例如给定 M=5 ...
- Codeforces Round #516(Div 2)
比赛链接:传送门 A. Make a triangle!(简单思维) 题目大意: 给你三条边,问你最多加多少长度能使这三条边能构成三角形. 思路: 最大边小于答案加另外两条边的和. #include ...
- HDU2019数列有序!
Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序. Input 输入数据包含多个测 ...