蓝桥杯C++ AB组辅导课 第四讲枚举、模拟与排序

重点分析过程,和学概率论一样


1210.连号区间数

n个数,找长度为1、2、3...的连号区间的个数

  • 模拟样例:

        3 2 4 1

        长度1的连号区间 4个 长度为2的连号区间有1个 d = 3有1个 d = 4有1个

        总个数7

(时间复杂度)?这个需要再看看

  • 算法思想:

最暴力做法:

        

        //前两个for遍历所有可能区间

        //将所得区间排序,再判断是不是连号区间。

 优化:

               1.优化区间 2.优化判断过程

                对于2.的优化:

                画绿的部分,找出连号区间的性质。

                题中给出条件:排列。全排列定义:把n个不同的元素排成的一列,称为这n个元素的一个全排列,简称排列。==>那么没有重复的数字。

                可以得到对于连号区间的一个性质:[a,b],Max-Min = b-a;

//每个序列得到最大的和最小的 判断是否符合性质

  •  具体代码:

12  .递增三元组

给三个数组求满足条件的三元组 ai<bi<ci

  • 算法思想:

        暴力做法:

        

        算法复杂度:O(n3)

        优化:

              数据范围:E5,那么应该用O(n)或O(nlogn)做法 =>最多枚举一个数组

               前缀和、二分、排序忘完了

             最多枚举一个数组,那么枚举A、B、C哪个数组?

             如果选择A数组,B和C是有联系的,不独立的,下面无法用乘法原理去做。选择B,A与C是独立的。

              接着对于B[i],找A数组比它小的数的个数,C数组中比它大的数个数。使用乘法原理将两数相乘。

               对于找数组中比一个某个数大的数字的个数,可以用方法一:前缀和。(数的范围小于e5)(从1开始,范围从0开始,所以在输入的时候每个数字+1)方法二:先排序后二分。

               前缀和方法:

        把A中出现的数的个数统计一下,再搞个前缀和,这样每个数前面有多少数字就一目了然了。S[8] = 3,就代表A数组中比9小的数字有三个。

        C的就往后搞。

 

代码实现:

1245.特别的数字

1

连续票据,一处错误导致一重一断

输入:N行,每行有几个输入用空格隔开

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值