【主办单位】
【课程时间】
3月4号-3月31号
【特训内容】
- 7次算法课,大赛特邀专家精讲历届真题及高频算法
- 直至赛前,资深算法老师群内作业辅导和答疑
- 全国参赛小伙伴互助带打
- 第2次课《递归原理与构造技巧》开课时间:2018年3月7日晚上7:30
【课程简介】
《2018蓝桥杯大赛算法特训》是应广大考生需求,由蓝桥杯全国软件和信息技术专业人才大赛组委会主办,聘请大赛资深顾问专家团成员之一于航老师,通过“图文+音视频”多媒体形式提供的蓝桥杯真题常见算法课程,同时还有持续至赛前的微信群作业和辅导答疑。本次课程提供回放。
【课程目标】
课程通过7次课共14课时深入浅出的讲解,帮助学生快速理解和掌握蓝桥杯大赛中常见的算法思维、算法技能和解题思路。同时提供持续至赛前的微信群内作业及辅导答疑,帮助学生提高学习效率、锻炼算法思维。
【课程大纲】
1、暴力破解与实用性优先
- 暴力破解在大赛及企业应用中的重要性
- 暴力破解中的实用性原则
- 逆向解法
- 枚举法
2、递归原理与构造技巧
- 递归的重要性
- 递归与循环的关系
- 递归的构造技巧
- 递归出口的考虑
- 参数设计
- 间接递归
3、典型问题的递归框架
- 排列问题
- 组合计数问题
- 组合枚举问题
- 递归设计——条条大路通罗马
4、数学知识的运用
- 并非数学竞赛
- 进制问题及其巧妙运用
- 整数与整除问题
- 欧几里得扩展定理
- 有理数表示,大数问题
5、博弈问题的思路
- 递归搜索的基本框架
- 当有平局时的考虑
- 尼姆定理
- 缓存结果
6、分治法与动态规划
- 分治思想的重要性
- 二分法是基础
- 动态规划问题的求解次序
- 复杂问题的规划
7、图及其他
- 图与树的关系和转化
- 图的基本遍历
- 利用树的性质
- 线段树与并查集介绍
于航
中科院计算所
曾于浙江大学电机系实验室、浙大网新、神州泰岳、中科院计算所等从事软件开发或软件技术培训工作,曾在嘉兴电力、福建电信、扬州联通、中石油物探、中国气象局卫星中心等大中型项目中担任项目组长或技术主管。
从第一届蓝桥杯大赛开始至今,作为大赛顾问专家团成员之一,为大赛提供软件开发技术方面的顾问支持,对蓝桥杯大赛有着深刻的影响和了解。
于老师授课风格轻松幽默,对复杂技术难题理解透彻,讲解深入浅出、层次清晰,喜欢以创新的方式呈现问题关键所在。
蓝桥杯算法特训第一课【实用性原则】源代码
【内容简介】
本文章内容为【2018蓝桥杯大赛算法特训(软件)系列课程】第一课【实用性原则】中涉及到的课上例题的代码实现,加入赛前特训获取全部课程内容请联系【小蓝】。
【课程中涉及的源代码】
1. 猜年龄
【问题描述】
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。
他曾在1935~1936年应邀来中国清华大学讲学。
一次,他参加某个重要会议,年轻的脸孔引人注目。
于是有人询问他的年龄,他回答说:
“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,他当时到底有多年轻。
【源代码】
【JAVA:于航】
1
2 3 4 5 6 7 8 9 10 11 |
public class A{
public static void main(String[] args){ for(int i=1; i<100; i++){ int a = i * i * i; int b = a * i; if((a+"").length()!=4) continue; if((b+"").length()!=6) continue; System.out.println(i + " = " + a + " " + b); } } } |
【C语言:志愿者】
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#include #include //判断数组里面每一个元素是否相同,相同返回1,不同返回0 int ifDiffInArr(char* arr,int num) { for (int x = 0; x < num-1; x++) { for (int y = x + 1; y < num; y++) { if (arr[x] == arr[y]) { return 1; } } } return 0; } //判断数组1和数组2里面每一个元素是否相同,相同返回1,不同返回0 int ifDiffOfArr(char* arr1, int num1,char*arr2,int num2) { for (int x = 0; x < num1; x++) { for (int y = 0; y < num2; y++) { if (arr1[x] == arr2[y]) { return 1; } } } return 0; } void main() { char arr1[4] = { 0 };//保存立方结果4位数的数组 char arr2[6] = { 0 };//保存4次方结果6位数的数组 int a, b;//保存立方和4次方的变量 for (int i = 1; i < 100; i++)//年龄从1到100 { //立方过程 a= i * i * i; //把整形转变为数组类型char* itoa(a, arr1, 10); //判断arr1数组里面的数字是否重复,重复的话就舍掉i,继续判断下一个i++ if (ifDiffInArr(arr1, 4) == 1) { continue; } //4次方过程 b = a * i; //把整形转变为数组类型char* itoa(b, arr2, 10); //判断arr2数组里面的数字是否重复,重复的话就舍掉i,继续判断下一个i++ if (ifDiffInArr(arr2, 6) == 1) { continue; } //判断数组arr1和arr2里面的数字是否重复,重复的话就舍掉i,继续判断下一个i++;不重复的话就是我们要找的年龄,并打印出来。 if (ifDiffOfArr(arr1,4,arr2,6)==1) { continue; } else { printf("计算结果如下:\n\n"); printf("数学家维纳的年龄是:%d\n\n", i |