本节课的主要内容:
暴力破解与实用性优先

(1)暴力破解在大赛及企业应用中的重要性

(2)暴力破解中的实用性原则

(3)逆向解法

(4)枚举法

1.1暴力破解很重要,很有用
1.2大赛解题的第一原则:实用性
1.3真题:年龄谜题
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,他当时到底有多年轻。
暴力破解的基本框架:
for(int i=0; i<100; i++){
   s = 把立方与4次方拼串
   if(test(s)==false) continue;
   print(i);
}
1.4检测重复的思路
第一种思路是建立一个包含十个元素的数组,检测0-9每个数字出现的次数。这种方法称作不重复。
还有一个写法检测0-9是否在前面得到的串中。这种方法称作不遗漏。
这两种方法等价。
但是从实用性的角度考虑,我们首先打印可能取得的值的立方和四次方

大部分人的肯定会将1-100,全部打印出来,我们可以在使用前面的条件“我年龄的立方是个4位数。我年龄的4次方是个6位数。”首先进行筛选。

1.6 视频:猜年龄利用位数信息(请观看视频)(C的代码稍后会给,java更容易)
竞赛要学会用简单、快速实现,实用性强的的方法。
1.7不要唯美主义
我们的目标是:实用、快速、稳定、有效
1.8真题:罗马数字
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!罗马数字的表示主要依赖以下几个基本符号:
 
I --> 1
V --> 5
X --> 10
L --> 50
C --> 100
D --> 500
M --> 1000
 
这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。
比如:CCC表示300  XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
 
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。
比如:IX表示9  IV表示4  XL表示40 
49 = XLIX
    
更多的示例参见下表,你找到规律了吗?    
I = 1 
II = 2
III = 3
IV = 4
V = 5
VI = 6
VII = 7
VIII = 8
IX = 9 
X = 10
XI = 11
XII = 12
XIII = 13
XIV = 14
XV = 15
XVI = 16
XVII = 17
XVIII = 18
XIX = 19
XX = 20
XXI = 21
XXII = 22
XXIX = 29
XXX = 30
XXXIV = 34
XXXV = 35
XXXIX = 39
XL = 40
L = 50
LI = 51
LV = 55
LX = 60
LXV = 65
LXXX = 80
XC = 90
XCIII = 93
XCV = 95
XCVIII = 98
XCIX = 99
C = 100
CC = 200
CCC = 300
CD = 400
D = 500
DC = 600
DCC = 700
DCCC = 800
CM = 900
CMXCIX = 999
 
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
 
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。要求程序输出n行,就是罗马数字对应的十进制数据。
 
例如,用户输入:
3
LXXX
XCIII
DCCII
 
则程序应该输出:
80
93
702

这个题目的难点在于:小单位在大单位左边这种情况,而且还不是所有的小单位放到大单位左边都成立。比如I在C100左边,就不成立。可是特殊情况有限:

IV:4  IX:9     
XL:40 XC:90
CD:400 CM:900
这种特殊的组合可能出现多次吗?不会!

大家习惯于找规律,如果情况比较少,并非成千上万,我们可以使用枚举法解决,也称为列表法。

1.9 视频罗马数字的枚举解法(2段视频)
1.11真题:九宫幻方(这没有落下任何内容,原版课程有错,咱们保持一致)
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。            
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。            
4 9 2
3 5 7
8 1 6
有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。
现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
            
而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~
 
输入格式:
输入仅包含单组测试数据。
每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。
 
输出格式:
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。
 
样例输入
0 7 2
0 5 0
0 3 0
 
样例输出
6 7 2
1 5 9
8 3 4
 

有很多同学可能会考虑,如何对标准方阵进行镜像和旋转变换,其实呢,这个矩阵进行变换情况就那么几种。在考场上写程序计算,就不如直接自己把所有的情况列举出来。

还有一个就是,我们一定要用二维数组表示矩阵吗?我们用一维会不会简化程序。

1.12 视频九宫幻方解法(二个视频)
关于刚刚的罗马数字问题,我们还需要考虑错误输入的情况。比如DXM。我们需要进行一个过滤。请大家自己思考一下,这个问题你会怎么解决!!!
问题:罗马数字串怎么判断是否合法
这里我们使用[罗马数字逆向解法](请看视频)
总结
1. 情况少,可以直接用枚举,不要用if for 等逻辑
2. 有的时候可以考虑逆向进行判断,计算机很快的。
逆向就是:原来从A求B,你可以从B求A,去碰条件
3. 能人工观察 + 机器辅助就不要把代码逻辑写完全,浪费时间。(深有体会,能自己一个个数的一定不要觉得自己写程序牛,要静下心来一个个数。)
 

真题(这个题目很难,大家可以选择不做)

魔方可以对它的6个面自由旋转。
我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。
 
各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄
 
假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转
 
xyz 则表示顺序执行x,y,z 3个操作
 
题目的要求是:
用户从键盘输入一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。
 
例如:在初始状态,应该输出:
绿红白
 
初始状态下,如果用户输入:
x
则应该输出:
绿白橙
 
初始状态下,如果用户输入:
zyx
则应该输出:
红白绿

这个题目的讲解视频,以后会给大家。

提示:魔方一共有4*6个小面,情况并不多。旋转就是小块的变换。我们使用三维矩阵当然会比较直观,但是我们是不是可以用更容易操作的矩阵进行变换呢。

作业题目:信用卡号的验证
【信用卡号的验证】
 
当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
 
则,奇数位和=35
偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。
最后35+35=70 可以被10整除,认定校验通过。
 
请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。
比如,用户输入:356827027232780
程序输出:成功
 
【参考测试用例】
356406010024817     成功
358973017867744     成功
356827027232781     失败
306406010024817     失败
358973017867754     失败

这个题目相对容易,大家应该都能做出来。请一定使用枚举法。这个课程,请大家一定认识到枚举的方便性。看到题目,在情况有限的时候,一定首先想到这种相对简单的方法。

 

01蓝桥杯特训课程第一次总结相关推荐

  1. 【蓝桥杯程序设计大赛感想】 一路艰辛 一路收获

    故事开始: 2014年来到大学,第一时间就听闻蓝桥杯,再听闻这个比赛全国总决赛的比赛地点是北京,我内心中瞬间涌现出一个信念:北京我是去定的了! 我中职读的是计算机网络专业,期间自学了C语言,怀着试一试 ...

  2. 第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-职业院校组-知识点题解

    这个题解是参考了"海底烧烤店ai"一位非常优秀的全栈领域创作者的博主写的,自己在看的时候发现个人知识点比较欠缺,所以就在题解下面添加了一些知识点,便于理解. 原博主的文章链接如下: ...

  3. 蓝桥杯软件组如何混进省一

    0.蓝桥杯介绍 为促进软件和信息领域专业技术人才培养,提升高校毕业生的就业竞争力,由教育部就业指导中心支持,工业和信息化部人才交流中心举办蓝桥杯大赛.十一年来,包括北大.清华在内的超过 1300 余所 ...

  4. 蓝桥杯 ADV168 算法提高 快乐司机(贪心 快排)(java)

    算法提高 快乐司机   时间限制:1.0s   内存限制:256.0MB      问题描述 "嘟嘟嘟嘟嘟嘟 喇叭响 我是汽车小司机 我是小司机 我为祖国运输忙 运输忙" 这是儿歌 ...

  5. 2021第十二届蓝桥杯Python组国赛/决赛 题解

    2021第十二届蓝桥杯Python组国赛/决赛 题解 前言 2021年第十二届蓝桥杯国赛/决赛,因为疫情原因没有像往年一样前往北京参赛,而是在自己学校的机房进行考试,形式上类似蓝桥杯省赛,但由于参加国 ...

  6. 【今日开播】第十二届蓝桥杯决赛特训营开播啦!国赛冲冲冲!

    官方出品,真题串讲,决赛冲刺! 第十二届蓝桥杯的国赛马上就要开始了! 为了帮助同学们更好地备战决赛,大赛组委会特推出「第十二届大赛(软件类)决赛特训营」活动. 我们邀请了蓝桥杯大赛组委会特邀专家.蓝桥 ...

  7. 蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出

    [1]题目要求 新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能: 1.将IIC总线的底层驱动代码文件正确移植到工程中. 2.将J5配置BTN模式,把S4设置为独立按键 ...

  8. 蓝桥杯单片机 | 特训案例【进阶03】24C02的基本读写操作

    [1]题目要求 新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能: 1.将IIC总线的底层驱动代码文件正确移植到工程中. 2.系统上电后,从24C04存储器的0x01. ...

  9. AcWing 蓝桥杯AB组辅导课 01、递归与递推

    文章目录 前言 一.递归 知识点 例题 题目1:AcWing 95.斐波那契数列[简单,递归写法] 题目2:AcWing 92.递归实现指数型枚举[简单] 题目3:AcWing 94.递归实现排列型枚 ...

最新文章

  1. nginx源码分析--内存对齐处理
  2. python 转短链接_使用Python生成url短链接的方法
  3. Hadoop基础-HDFS集群中大数据开发常用的命令总结
  4. 022_配置configuration
  5. [转]浅谈浏览器插件检测 和自定义协议的支持
  6. ios打包报错:User interaction is not allowed
  7. 注册不到两年半Github标星39k+,吴恩达、李航老师的作品的笔记和代码实现
  8. Boost:列出设备的测试程序
  9. Auto packing the repository in background for optimum performance.
  10. [JavaWeb-Servlet]Servlet中的生命周期方法(init,service,destroy)
  11. [转]ASP.NET 状态服务 及 session丢失问题解决方案总结
  12. android切图倍数,【Flutter工具】fmaker:自动生成倍率切图/自动更换App图标
  13. JS数组的相关操作(循环、查找、过滤、排序等)
  14. 如何通过事件可视化分析?
  15. 安卓10不支持qmc解码_你永远都不知道手机中计算器的秘密!安卓IOS都支持!
  16. Ubuntu 22.04 下安装uhd和gnuradio的快捷方法
  17. 微软发布Windows 10:连Windows 7都能免费升级了
  18. charles把抖音数据保存到本地处理
  19. PPT插件(VSTO)开发入门
  20. 热销超极本iFunk翼S到底怎么样?

热门文章

  1. disallow api.php,爬虫之robots.txt
  2. fedora16上搭建lxr-1.2.0
  3. AssertionError: View function mapping is overwriting an existing endpoint function: inner
  4. Java中resualtset,Java SafeEncoder類代碼示例
  5. 关于enq: TX - allocate ITL entry的问题分析
  6. 实验四:app内页面跳转
  7. 传统消费将被销巴生活全返消费颠覆
  8. 电商系统搭建(商品订单模块)
  9. pcie数据反_理解PCIE链路反转和极性反转
  10. csapp attack lab