蓝桥杯|01蓝桥杯特训课程第一次总结

本节课的主要内容:
暴力破解与实用性优先
(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表示300XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。


如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。

比如:IX表示9IV表示4XL表示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:4IX: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蓝桥杯特训课程第一次总结】

    推荐阅读