啊,两种路线他都能出,大神,你们看你属于哪种,然后选择哪个路子?第一种啊,就是这个科班的方式就是培训出来的,参加这种夏令营。这种培训啊,跟老师学算法,或者跟什么什么课程自己学,然后呢?科学的训练培养出来的,这是第一种,这是最传统的方式。 第二种方式嘛?第二种方式我觉得这个这些人要带一些,就是天赋要更好一些,就是这些人就野路子出来的,他不是说被教出来都是自己研究出来的。呃,早年我知道行业的一个大神,曾经是那个 waterfinel 去世界总决赛的一个金牌选手,他就是 之前全是零基础大学才刚学编程,然后呢?没有电脑怎么办?去网吧通宵刷,你能做到吗?还不用说,横店大神,之前,呃,我们那个大工的一个,那个学 在实验室里面把被子抱过去了,也是通宵打扮去刷,你能做到这种效果吗?你只要能有这股劲去学那些算法问题其实你你都不用别人教你,你自己就知道如何去学。这个我不有,该研究了。 啊,那个算法我需要学了,这个题我解决不了,我今天晚上不睡觉看我那股劲,有那个学习劲的话是根本不需要人教的。
粉丝590获赞5581

大家有没有听说过姚班、志班、图林班和 acm 班,其中姚班和志班呢,是设立在清华大学,由图林奖得主姚七志愿是作证。这两个班级同学基本上都是从国际数学、物理和信息奥赛金奖得主中筛选出来的, 或者呢,是各省的顶尖的理科状元,是以培养理论计算机研究人才和人工智能研究人才为核心目标的著名的人工智能创业公司。旷世他的所有的创始人就都毕业于表记者 北京大学图领班,他是由两位图领奖得主作证授课的。他的同学呢,是从北大五百多名优秀的理工科入学学生层层筛选选拔出来的,希望能够培养出未来的计算机精英。上海交通大学 acm 班 acm 呢, 是组织和颁发图领奖的计算机管理协会,就是为了培养未来计算机专材而设置的。

大家好,我是阿娇,以后想吃煲仔糕不用出去买了。前面出了一期煲仔糕教程的视频,很多姐妹说能不能不加马蹄粉, 今天就把不加马蹄粉的教程分享给大家。今天我全部用杯子来量,方便家里没有上的朋友。八十毫升白糖,再用三百二十毫升的清水把白糖搅拌融化,再加入四杯不满杯的波嘴,高仿四杯,共两百克。 快速把它搅拌均匀,搅匀后过一下细筛,口感更加细腻。我今天做的是带颜色的钵仔糕,碗中倒入适量的水果粉, 也可以用水果酱来做,根据自己的喜欢去加。在每一个碗中加入七十毫升的盐酱,快速把它搅拌均匀,化开。容器中加入自己 喜欢吃的水果或是干果,也可以不加,因为加了水果酱和水果粉,自己在家做,想吃什么就放什么,再把刚才调好的水果原浆倒八分满。我今天做的是家庭版的钵仔糕, 如果想收摊的朋友,一定要加马蹄粉哦!加了马蹄粉的煲仔糕放久了也不会硬,然后冷水上锅蒸,大火煮开后转小火蒸二十分钟。 收锅前如果碗中有水,要把它倒掉,一定要等凉套后再脱模,这个颜值真的可以收摊了,特别的好看。我女儿还叫我做了几个动物形状的钵仔糕,他说要送给表姐,结果太好吃了,全部把它撕掉了, 口感 q 弹不粘牙,再加上水果的香味,太好吃了,如果你也想吃,收藏起来试一下吧!

参加 a c m 竞赛的正确流程,今天给大家做一个不完全的分享,如果是第一次参加,可能用得上好好听。 呃,一般来说 a c m 竞赛是周六周日两天,就是安排在周末的,周六是第一天热身赛,正式赛是在周日 啊,以我为例,我上次那个时候,一般来说我们周五就会动身去呃到达主办方所在的城市,坐高铁坐飞机都行啊,取决于学校这个报销的情况以及路途远近情况。 然后周五其实就干两个事情啊,第一个就是呃跟主办方联系到,一般大型的比赛或者主办方足够重视的话,你到达那个城市高铁站之后就会有志愿者或者有路标会指引你的,就像 呃,开学九月份开学迎新一样,就是有接新那个状态,知道吧,他会,他会接你们的,因为你们是贵宾啊,会接你们的, 然后跟他们这个志愿者取得联系,就是说告诉他们你们到了什么什么大学,什么到了,这就是报道。然后他还会发你们比赛用的衣服,因为是统一衣服衣服的,会发一个短袖,会是一个长袖外套。然后呢,如果有一些赞助商的话,可能会发些纪念品,都有可能, 然后领到这些东西,这第一件事完成了。然后第二件事情就是呃入住到你们需要下榻的酒店,可能是你们呃学校里的招待所,也有可能是呃主办方的招待所啊,也有可能是主办方周边那些有协议价的一些酒店都行啊,最重要的原则就是要近,不能太远啊, 这要注意,这周五干完就可以了,周六的话呢,正常早上起来起来吃了饭就去这个主办方直奔这个考点啊,不叫考点,叫做比赛场馆,一般来说会在学校的图书馆里或者说是体育馆里,因为这些地方才能容纳的下 好几百只队伍上甚至几百人,正将近千人的一个场馆。你要测试一下你们正常走是花多长时间,这样才知道周日你们提前多长时间到, 明白吧?这是要去之前,那么如果你需要拍照的话,一定要把衣服就要换上了,周六你也可以不换,你也可以周日换,但是呢,呃,看个人情况啊, 到了之后先找你们的桌子在哪,因为几百张桌子很大,你要找到第几第几列啊,第几号是你们桌子会每个桌子上会有一个什么什么大学,什么什么队伍的一个牌子,找到你们的桌子,先熟悉到位置,然后呢,开个电脑 熟悉一下你的电脑什么配置啊,什么浏览器啊,题目在哪,地址是什么,然后呢?键盘鼠标好不好用,这个电脑卡不卡,好不好用提前都要适应好,如有问题提前跟裁判现场的老师去 沟通这个事情,确保没问题。然后这个热身赛他也是有一些题目的,一般都比较简单的题,像我们之前基本上不怎么做,就做一道,可能就就意思意思就可以了啊,大部分时间可能我们就去就闲逛去找找,比如以前的一些 以前比赛认识的一些其他兄弟院校的一些学长啊,同学啊,去唠唠嗑就是叙叙旧什么的,或者一块合个影什么的,然后去学校里逛一逛就 ok 了啊,其余时间就是 你可以闲逛也可以去。呃,去去去,附近有什么景点你们想去可以自行去安排,但是呢,周六注意啊,一定有一个重要事情要干完,就是你要把周日这天正式赛需要的资料也好,吃的东西也好,用的东西要全部买完,因为周日是没有什么时间的, 比方说周日这天比赛是九点到下午两点,主办方一般会发一些呃,简单的吃的,面包啊,牛奶这些, 如果你吃不惯,或者说,呃这个比如需要买点咖啡这个提神,或者说需要打印点资料,比如说打印一些算法模板,那这些事周六全部干完, 不要等到周日去,你没有时间的,相信我,没有时间的能让自己多睡一会也比这个强。所以这些要干的琐碎知识周六必须要干完,然后 你可以去玩了,可以去自行安排了都行,这个在你们周六其实时间是最富裕的,当然给大家提个醒啊,不要去吃那些 呃,乱七八糟东西,也不要去太远地方,让自己累到,这些都影响你第二天发挥,千万别吃那些不干净东西,让自己窜稀或者不舒服,你知道会非常影响你第二天发挥的。 然后呢,周六就这样呃,度过就可以了。然后周日早上你你算好时间,比如说你半小时就能到,那你八点起来或者吃个早饭,呃,把时间预估好,在 这个比赛场馆之前准备就可以了。九点会让你们提前个十分钟吧,会让你们提前进场馆,九点正式开始会给你们每一个组会有一个指示材料,三个人一个组,然后你就可以答题了, 然后你就正常发挥就可以了。比赛两点结束之后,这个时候该合影的该去你们学校合影,或者跟其他的一些呃同学合影纪念的。打卡的这个时候开始, 然后一般会在几个小时之后,可能会在四点五点都可能会会主办方会举办一个颁奖典礼,会现场公布金银铜的获奖者,以及这个颁奖完事之后,你们就可以拿着奖牌 或者奖品就可以离校了。如果你有时间的话你可以再玩,如果没有时间的话,那你就要当天就要返回,就这样一个情况,想想还是挺有意思的,是不是?所以有机会参加 a c m 加油!

同学们好啊,接下来我们来讲解算法中的时间限制和空间限制,这应该是算法竞赛。好,我们先来给大家说两个常识啊,其中第一个常识就是信息学竞赛中啊, c 加加通常设定一到两秒的时间限制,然后在这一到两秒内啊, c 加加基本上是能执行十的八次方次左右的运算的, 因此我们要控制我们整个程序的运行次数在十的七次方次左右的运算的,因此我们要控制我们整个程序的运行次方之间啊,这是第一个常识。然后第二个常识就是 啊,空间一般限制在一百二十八兆或者是二百五十六兆,此时啊,我们是可以开辟一个三乘十的七次方大小的 int 类型的数组,或者是五千乘五千大小的二维数组, 但是这两个数组,但是我一般开数组的时候都开不了这么大,所以说一般情况下空间上都是够用的,我们一般是不担心空间消耗,所以说我们重点放在我们的时间消耗上,就是 c 加加在一到两秒内,我们要控制我们的次数在十的七次方到十的八次方之间,那如何控制呢?哎,我们看上面这个表格啊, 刚刚我们这里有了一个表格,就是在 n 变化范围内,我们各个时间复杂度的值是如何变化。我们以一个为例,比如 n 的 结成为例,如果我们这道题的数据范围是十以内啊,比如 n 是 小于等于十的,如果是 n 以内的话,我们写的一个算法是 n 的 结成的话,就是不会超时的,因为 n 的 结成在十在十, 而在 n 等于十的时候,他是三六二八八零零是三乘十的六次方级别的,三乘十的六次方级别的是小于十的七次方级别的,所以说 n 的 结成是不会超时, 但是啊,如果 n 等于十六的话啊,如果 n 稍微大一点等于十六的话,你此时写的算法如果是 n 的 结成级别的时间复杂度的话,他就是二点一乘以十的十三次方,他就要超时了。 因此啊,我们在往后做算法期的时候,一定是二点一乘以十的十三次方,他就要超时了。因此啊,我们在往后做算法期的时候,一个合适的时间复杂度的, 不然的话啊,数据范围如果是一万的话,你选择一个 n 的 三次方的话,他就是要超时的。因此我们往后做算法题的时候,一定一定是要看数据范围的,根据数据范围选择一个就可以先判断一下你当前的这个想法能不能超,能不能就是能不能在 规定的时间内就是运行通过,因为如果你选的这个代码啊,就你的思路是 n 方的级别的, n 方级别的暴力解法,但是这道题的数据范围是十的八次方 或者是十到七次方,你一下 n 方就超时了,所以说我们往后做题要关注一下这个 n 的 取值范围。好,那应该如何来选择呢?我每次都要看这个图吗?其实没有必要,这里给大家就总结了一个图, 这个图其实也不需要大家死记硬背,因为往后大家做题做的多的话,你自然而然的就把这些数据都给记住了啊。好,其实我们来看,当 n 小 于等于十的时候,也说数据范围小于等于十的时候, 其实好多算法我们都是可以用的,也就是 n 的 结城级别的那种超级复杂的算法也是不会超时的啊。目前啊, n 的 结城的算法我们目前应该是还没有碰到,但是往后我们学习,随着我们算法课的学习,我们是会见到 n 的 结城级别的算法好, 但是当 n 稍微大一点变成二十五以内的时候, n 的 结成率先就被淘汰了,因为此时它就要超时了,其余时间复杂度的算法都是 ok 的。 当 n 再大一点变成一百的时候,然后这里二的 n 四方也要超时了,此时我们要选择小于 n 三方这些时间复杂度的算法。同理啊,当 n 如果小于等于一千的话, 此时 n 的 三次方就会超时了, n 的 平方是不会超时,因为十的三次方你平方一下是等于十的六次方啊,所以说 n 方的时间复杂度是不会超时,然后接下来继续扩大变成二乘十的五次方之后,它会把 n 方给卡掉,有时候会把 n 方时间复杂度的算法给卡掉,此时我们应该选择 n 乘 log n 或者是 o n, 或者是根号 n 或者是 log n 级别时时间复杂度的算法才行。好,如果继续扩大变成十的七次方的时候,此时 n 乘 log n 会被卡掉,有这种复杂度的算法会被卡掉,此时啊,我们只能选择 o n 啊,或者是根号 n 啊,或者是 log n 级别的算法。 如果是十的九次方的话, o n 也会被卡掉,因为 o n 的 话,你数据范围是十的七次方,其实刚好十的八次方也也也其实勉强能有,但是十的九次方的话是一定会超时的,此时我们就必须要选根号 n 或者是 log n, 如果时间复杂度继续变大,变成十的十八次方的话,根号 n 也会超时,此时我们只能选择 log n, 其实 其实啊,数据范围还会再变大,他有可能变成十的幺零零零零次方,那这个时候我们其实到时候就是用高精度的算法,那我们后面会再遇到,此时大家就先简单的记住这个表格就行了, 此时就先有一个认知,就是如果数据范围很大的话,有些复杂度较高的算法我们就不能用,那具体哪些算法不能用,随着后面的学习我们会逐渐深入啊,会会逐渐就是 会逐渐就是了解那些常见的,哪些能用,哪些不能用这个表格,不做死记硬背啊,大家就是知道有这个东西其实就可以了啊。好啊,那关于算法里面的所有知识点啊,到这里就已经全部讲完了,那么接下来就该讲解 s、 t、 l 里边的内容了,我们下一个视频再见。


今天是我儿子的生日,第一次在家做蛋糕,才发现做法这么简单,新手小白也能成功。外面一百多,在家三十多块就能做出来。 碗中打入八个鸡蛋,蛋心蛋黄不用分离,再下一包老式蛋糕,一半放,里面含有糖,放就不用接糖了,可以慢速打发一到两分钟再改快速打发十分钟,把面糊打到变白,像酸奶状一样,流动性比较慢。 电饭煲锅底均匀的抹上食用油,方便煮好脱模。再倒入蛋糕糊,盖上盖子,按煮饭键煮蛋糕键五十分钟。尽管准备孩子不爱吃的水果, 洗净去皮后切成条,再改刀把它切成粒。我儿子说妈妈做的蛋糕外观不比外面的 好看,但是口感和外面的一样好吃。蛋糕煮好后脱模拿出来,再把它切成两到三厘米的厚片,这个蛋糕切出来松松软软的,不会裂开,也不会回塌。碗中倒入五百克淡奶油,六十克细砂糖, 开电动打发助农勺,淡奶油要打老一点,打发成像视频这样提起来没有流动性。再把它装进裱花袋中, 家里有裱花嘴的话就装上裱花嘴,没有的话用袋子剪一个小烤。像视频这样挤一些奶油,然后就把它抹匀, 边边再挤一些厚厚的奶油,再铺上刚才切丁的芒果、哈密瓜、西瓜,最后再挤上少许的奶油,再盖上一层蛋糕,重复刚才的动作,然后 要将最后一层蛋糕盖上来,最后挤上奶油,全部把它抹匀,再挤出你喜欢的花碗,再摆上各种颜色的水果,再撒点碎麦片点缀一下,这样一个非常简单又美味的小蛋糕就做好了, 自己在家里做,真材实料,经济又实惠,家里有过生意的朋友可以试一下哦!

a c m 电机的一些使用方法。第一个我们这个灯在闪烁的时候啊,说明这个这个电机的线位已经调好了啊,现在我们需要把它的线位解决,那我们在后面也会按 shift 键啊,这个键连按五下,一二 三四五。好,这个线位就没有了啊,这个灯就是形成绿色的,我们先调行程啊,很简单,按着这个上不动啊,调到自己想要的一个位置啊,你们觉得可以了啊,再伸手再把上一根田径一捆塞下去。 好,这样上行位调好了,下行位也是一样啊,调到你想要的位置,调好之后,下进一层一层粘上去。好,这时候这个行位就调好了,嗯,这个行位就已经调好了,这是调行位的一个方法。 配手柄啊,我们这里有个手柄按键啊,可以按这个学习啊,这手柄那个学习,长按就把我们的密码消掉啊,短按就是学习好了,因为我们这款电机它是出厂配置,是配了三个手柄啊,三个手柄 再加上我们的这个按钮开关线,然后再加上一个墙壁按钮开关啊,这个上面配有一个胶,那个双面胶直接贴上去就可以了啊 啊,但这个他是需要学习的啊,跟这个遥控器拷贝一下啊,这后面也有说明书,怎么拷贝啊? 跟这个遥控器拷贝就可以了,这是一个搭配的一个配置啊,他的提升力是相当大的啊,正常平方那个四米五 乘以五米五高是随便提啊,一般的就是零点六到零点八的看房门都可以提的起来啊,就是他的配置,他会配置一些,嗯,支架板最好是配置厚一点的支架板比较比较好用啊,有些支架板太薄了,那么对这个电机它也是有影响的啊, 他的这个稳固性不好,所以这款地区的优势会有很多啊,包括调定位的时候,我们可以站在下面调啊,这样就保证了我们这个安全性。这个站在牢牢的上面调啊,很容易 啊啊,人从上面呢掉落下来,所以这是一个安全的一个性能啊,他的前程信位是很精准的一个信位啊,所以希望大家多了解一下这款定型。

同学们好啊,从这个视频开始,我们就要讲解第五张对列和 q, 那 我们先来看一看啊,接下来我们要学习哪些内容啊?本章一共会讲解六个部分啊,其中第一个部分就是对列的相关概念,然后第二个部分就是对列的模拟实线, 然后第三个部分就是 c 加加里面 s t l 为我们提供的对列 q, 然后第四个部分啊,就是对列相关的算法题。然后第五个部分啊,我们这里要认识一个特殊的对列,就是双端对列, 关于这个双端队列,我们就是仅需了解即可,模拟实线是不做要求的。然后第六个部分啊,就是 s t l 为我们提供的双端队列 d q。 大家会发现我们本章要讲的内容看似是有点多的,但是不要担心啊,队列这个数据结构跟我们在上一章学习的站这个数据结构一样,都是相对简单的啊,因此内容看起来虽然很多,但是学习起来也不会压力太大啊。 好,那我们先来看第一部分,就是对列的相关概念,先来认识一下对列这个数据结构,那我们依旧先用 ppt 给大家展示一下啊,然后在课间上给大家总结 关于对列的概念。我们一共会讲两个部分,第一个就是对列的定义啊,然后第二个就是相关的术语。那我们先来看对列的定义, 对列啊,他也是一个特殊的限性表啊,那随着对列这个也是一个限性结构啊,所以他只允许在表的一端进行插入操作,然后在另一端进行删除操作。那相比较相比较于我们的站那,大家来回忆一下站这个数据结构,他是只允许在一端进行插入和删除 这个队列式,他在一端进行插入,在另一端进行删除。那如果用图示来表示的话,我们一般是在表头这个位置执行删除操作,然后在表尾这个位置执行插入操作。比如说我想删除元素的时候,我得从表头开始一个一个的删啊,一个也删,我不能, 我不能啊,就是假设我有一个队列, a 一 到 a 五,我不能先删 a 四这个元素,呃呃, a 二这个元素必须得先删完 a 一, 然后再删完 a 二,然后当我想往这个队列里面添加元素的时候,我们一一般是在另一头进行添加,比如说我添加元素的时候,应该是放在这个 a 五的后面, 如果想继续添加的话,是要放在他的后面,此时我想添加的时候,也是不能再随便找个位置添加,这都是不允许的啊。比如说这个对立啊,他其实也是一个访问受限的限性表, 此时我们在进行插入操作的时候,必须在尾部进行,然后再进行删除操作的时候,必须在头部进行,这就是对列这个数据结构。那其实我们在生活中也是有很多对列的例子的,比如我们在排队打饭的时候啊,如果把这一群人当成, 如果我们在研究对象是这一群人的话,那这一群人就可以当成一个队列,因为当起当一个人打完饭之后,他想离队的话,是从最前面开始离队。当一个新来的人啊,就是想加入到这个队列的时候,他是要进入到这个队列的最后面啊,队列最后面,所以说我们生活中这个排队打饭的例子, 跟我们这个队列这个数据结构是一对应的啊,一对应啊。同理我们这个打印机按序打印的这个例子,它其实也是一个队列。大家来想一想啊,不知道大家有没有在打印店打印过东西,如果很多人共同用一台打印机的话, 打印机那里其实是有一个打印队列的啊,是有一个打印队列的,你先传入打印机的这个文件,会先被打印,然后后传入这个打印机的文件,它会先被挂起啊,先被挂起,然后等前面的, 等前面需要打印的东西打印完之后,你后面传入打印机的,才会接着打印。所以说打印机按序打印这个其实把里面所有的文件也可以当成一个对列来看待,因此对列这个数据结构,他跟我们生活是比较贴近的,所以说大家在学习他的定义的时候,是可以拿我们生活中的例子来类比的, 意思他的定义应该是比较简单了。那接下来我们再来看一些相关的术语啊。第一个就是空对,那空对那就很简单的,如果以右边这个图当成对列的话,空对的意思就是对列里面没有任何元素,那入对这个操作就是往对列里面加入元素,假设我们在这端删除,然后在这端进行插入, 那如果往队列加入元素的话,那相当于我要从这端添加元素啊,就是从右端添加元素。此时假设我要想把 a 加入队列,那就是 a 从最后面,然后放到队列里面,同理, b 想入队也是从最后边入队, c 想入队也是从右边入队, 既想入对,也是从右边入对,好,这就是入对操作。入对操作的意思就是往堆列里面添加元素,那接下来什么是对头,什么是对尾?那看名字就知道,对头就是在这个堆列里面的第一个元素。我因为我们是在前面进行删除,后面进行插入,所以说左边这个 a 这个元素,它就可以称之为对头元素。然 右边 d 这个元素啊,我们就可以称之为对尾元素。好,这两个概念也是比较好理解。接下来那个出对,那出对呢?就是往队列里面删除元,就是在队列把队列里面的元素删除,那删除的话,我们是从左端删除,比如说是从对头元素开始删,因此出对的话,我会先让 a 出对, 然后再让 b 出对。好,那大家来观察一下,刚刚我们入队的时候啊,是 a 先进来,然后 b 先进来, 然后出队的时候也是 a 先出去, b 先出去。因此队列就有一个特性,就是先进,先出就是你先进入队列,这个元素会先出去。那可以对比一下我们那个战,我们的战是后进先出,战是最后进来那个元素先出去。 这个队列啊,其实跟它是相反的,是先进来的元素先出去,就是 first in、 first out, 这是队列的特性,因为我们是从后端插入的,然后我是从前端删除的,所以说你最先进来的这个元素会先出去,这就是队列的特性。 好,那我们来总结一下,这个队列和站其实都是一样的,都是一些访问受限的限行表,但是正是因为他们访问受限,所以说可执行的操作就很有限。比如我们在学习站那里啊,就是 查询一下最后一个就是站点元素是什么,然后进站操作,然后入站操作,然后看看站是不是为空,看看站里面有多少个元素。同理,我们这个队列里面也是可执行的操作也是有限的,比如 进队操作、入队操作,看看对头元素,看看对尾元素,看看这个队列是不是为空,看看这个队列里面有效元素是多少,因此啊,他就显得比较简单。那我们学习这两个数据结构的难点在于用它们去解决问题上啊。 好,那以上就是我们 ppt 里面的所有内容了,接下来我们来课间给大家总结一下。对立啊,这个东西其实也是一种访问受限的限信表, 它只允许在表的一端进行插入操作,然后在另一端进行删除操作,然后允许插入的那一端,我们称之为对尾,因为我们每次进对的话,都是放在对的最后面,然后允许删除的一端叫做对头,那就是从对头元素开始删除。 先进入队列的元素会先出队,因此队列具有先进先出的特性,就是 first in, first out。 好, 那以上就是我们关于队列的概念的全部讲解,接下来我们就来模拟实现一下队列这个数据结构啊,因为队列跟上一张的站一样,都是比较简单的啊,所以说我们这里就不用 ppt 给大家展示细节了,直接用刻件上的图结合这些文字就 足够了。好,那我们先来搞定,第一步就是创建出来这个对列,因为对列啊,本身它其实还是一个限性表,所以说我们用一个足够大的数组 就可以充当这个对列。当然我们这里实现的方式也是静态实现。在这个对列里面啊,我们要频繁找到对头以及对尾的位置,所以说我们需要两个变量,也可以说是两个时针来标记对头以及对尾的位置。其中一个变量 h 就是 head 的 缩写,标记的是对头元素的 前一个位置。好,这里注意一下,待会我来解释啊。然后另外一个变量 t 标记的是对尾元素的位置,比如下图所示,此时我们队列里面有四个元素,分别是九五四一,九五四一。这里注意我们下标为零的位置依旧不存储有效元素,有效元素是从下标为一的位置开始存储的, 其中 h 这个变量标记的是头节点的前一个位置,所以说 h 是 等于零的。然后 t 这个变量啊,标记的是对尾元素的位置,所以说此时 t 是 等于四,这样是一种左开右闭的设计形式, 这样的设计啊,就是纯属个人喜好,因为后续写代码的时候会比较舒服啊,所以说我习惯上让对头标记的是让 h 标记的是对头的前一个位置啊,以这样的形式来设定。 当然大家也可以让这个 h 标记对头元素,比如此时如果是九五 c 的 话,大家也可以让这个 h 等于一啊, h 等于一标记的是头尖的位置, 只要大家能够控制住代码不出现 bug, 只要你实现的这个是一个队列,你想怎么实现就怎么实现,我这样实现纯属个人爱好纯属个人爱好。那接下来我们先搞定我们的第一步就是创建的工作,切到我们代码这里, 写下我们这个代码啊,很简单,就是搞搞,搞一个数组,然后搞两个变量就行。好,先定一下数据范围, ctrl n 是 等于一五,再加上一个十。然后第一步就是创建的工作, 我们搞一个队列,起名为 q, 然后再需要一个 h 标记投极点的前一个位置,然后再需要一个 t 就 可以了。那刚开始因为我们这个 t 标记的是有效元素的个数, 刚开始有啊,就是对尾元素,刚刚开始队列里面还没有任何一个元素,所以说这个 t 是 等于零是没有问题的,因为我们下边为零是不存储有效数据的, 同理这个 h 的 位置也是正确的, h 刚开始出水化为零,他标记的就是头节点的前一个位置,当前还没有头节点,就是当前还没有对头元素,所以说 h 等于零也是没有问题,所以说我们这两个值出水化为零是没有一点问题的。 接下来我们来学习第一个操作,就是入对操作,入对操作就是把 x 这个元素放到队列里面,那放到队列里面,那就是放到队尾的元素这里,那此时队列里面 加入新的元素了,那这个 t 刚才标记的就是前一个队尾的位置,那所以说我们应该先让 t 加加啊,先让 t 加加,然后把 t 加加,这个位置的值变成 x 就 可以了,所以说就是先让 t 加加,哎,然后把 t 加加这个位置的值变成 x, 那 一句代码就搞定,那我们代码框这里实现这个代码就是入对操作 啊,其实就是我们顺序表里面的尾差操作啊, push 要另一个变量 x。 好, 那直接让对尾元素对尾先加加,那我们可以先加加 t, 然后把这个值复制成这个 x 就 可以了啊,就是这个 t 先加加,然后把这个位置值复制成 x 就 搞定。那当然我们这个代码也是有 bug 的, 就是 你这里面创建的数据范围是一五加九了,此时你在加加 t 就 会越界访问, 所以说大家在执行这个入对操作的时候,一定要判断一下你当前这个数据范围是不是已经大于一五加十了。好,这是入对操作,很简单啊。好,接下来我们来看这个出对操作,出对操作就是删除这个对头元素就可以了,那么我们并不需要把它真的在这个数组里面删除, 只仅需让这个头节点的指向后移动一位,相当于就是把这个对头元素删除了。比如大家来看下面这个图,里面有效元素是 a b, 如果想把 a 删除的话,我们直接把 h 加加, h 加加,此时我们的对头元素相当于就是 b 了啊,此时 a 就 相当于被我们删除掉,所以说删除对头元素仅需让 h 加加就完事了。那我们来实现一下这个过程啊,这个是出对操作,然后直接让 h 加加就可以了。当然我们这个 h 加加也是有 bug 了, 因为你想出对的话,你这个队列里面得有元素才行,对吧?你这个队列里面如果没有元素的话,你这个 h 加加那就会出现 bug, 所以说到我们在调用这个 pop 函数的时候,你这个队列里面必须得有元素才行。大家要知道我们这个这两个代码都是有 bug 的 在,但是我们相信我们在调用的时候别让它出现 bug 就 可以啊。好,那接下来我们来实现下一个操作,就是查询对头元素,就是返回队列里面的第一个元素, 这里要注意啊,这个不是 h 所指的位置,而是 h 所指的下一个位置。比如如果此时数组里面是 abc 的 话,但是 h 的 值如果等于一的话,实际的对头元素应该是 h 等于二的这个位置,所以说我们直接输出 h 加一的位置的值就可以了。那所以说我们实现这个函数就是查询对头元素, 搞一样一个 int 吧,这里起名为 front, front 就是 头的意思,那 front 就是 查询对头元素的意思,那我们直接 return q, 然后 h 加一就可以了。当然我们这个代码也是有 bug, 因为你想返回对头元素,你这个队列里面得有元素才行啊。 你这个队列里面如果没有元素的话,你是不能查询对头,你是不能返回对头元素,所以说我们这个代码也是有 bug 的, 但是我们调用的时候,我们让这个队列里面有元素的时候,再调用这个函数就可以了。好,那接下来我们再实现下一个函数,就是队尾元素,那就是返回队列里面的最后一个元素, 因为我们这个 t 变量标记的正好就是最后一个元素,所以说直接返回这个 q t 这个位置值就可以。好,那接下来我们实现这个函数,查询对尾元素,直接搞一个 int back b a c k 啊, back 就是 最后面的意思,那我们直接 return 这个 q t 啊就可以了。当然大家在调用这个函数的时候,同理你这个队列里面也得有元素才行。好,那接下来我们实现下一个, 就是判断这个队列是否为空。好,判断队列是否为空,其实仅需看看这个 h 和这个 t 是 否相等就可以了,因为 h 标记的是头节点的啊,就是头节点的前一个位置, h 标记的是尾节点,当这两个指针相遇的时候,说明这里面已经没有有效元素,所以说我们直接判断 h 是 否等于 t 就 可以了啊。所以说我们这里再来一个判空,写完吧,就是判断是否为空。那搞一个布尔类型 empty e n p e t 以外,直接 return 这个 h 是 否等于这个 t 就 可以。如果他们两个相等,说明对列为空,返回的是一个处,如果他们两个不相等,哎,说明对列里面含有元素,返回的就是一个 false。 好, 那接下来实现最后一个操作,就是查询对列里面有效元素的个数, 那此时 h 因为是一个左开右闭啊,左开右闭的区间,所以说有效元素的个数就是让这个尾尾时针减去这个头时针就可以。大家也可以看一下, 此时对列里面如果有 abc 的 话,这个 h 如果等于一, t 如果等于三,有效元素呢?只有 bc 这两个,那正好是三减一等于二啊,正好是三减一等于二,所以说有效元素的个数就是 t 减去 h 就 完事了啊。所以说我们这里再实现一下这个 size, 注,试一下有效元素的个数, 好,直接 return 这个 t, 减去这个 h 就 完事了。好,这就是我们模拟实现的这个对列,那我们在这里简单测试一下这个对列对不对啊? 测试,好,那我依旧写一个负函数吧,负函数 i 从一开始,然后 i 小 于等于十,然后 i 加加 好,然后依次往对列里面加入这十个元素,就是从一到十,那我们直接 push 这个 i 就 可以了。好,然后接下来 加完之后,我们一次当对列不为空的时候,我们拿出对头输出对头,拿出对头输出对头,或者是我们直接输出当前这个对列里面的对头和对尾,然后把对头元素删除,然后继续输出对头和对尾。这样的逻辑啊,就写个胃口循环,当 这个队列里面还有元素的时候,同理我们这里来判断也可以这样写,就是一个 while 循环,然后 empty, 当这里面不空的时候, e m p t y 啊,这就是当队列里面有元素,或者是当这里队列里面不空的时候,我们一直执行下面的逻辑,就是先输出对头和对尾,那就是 front 以及 back 好, 然后再把对头元素删掉,那就是执行一个 pop 就 可以。好,那我们测试一下。好,来看啊, 我们这个队列是先进入一,然后二,然后一直到十,那随着我们这个队列其实就是一到十,然后对头是一和十的时候,然后把一删除,变成二和十,变成三和十,然后一直变成十和十。好,没有问题啊,说明我们这个测试说明我们实现这个队列还是没有问题的。 好,那关于队列的模拟实现到这里就已经全部讲完了,接下来我们来学习 stl 为我们提供的队列 q。 我们学习一个容器的时候,依旧注意三点就 ok 了,第一点就是如何创建,然后第二个就是创建出来的这个东西里面给我们提供了什么函数,也就是给我们提供了什么接口。然后第三个就是每个函数的功能以及 时间复杂度,搞清楚这三点,我们这个 s t、 l 里面相应的这个容器就算是已经学到位了。好,第一个我们先来学怎么创建,那这个 q 啊,跟我们之前的 stack 了,或者 viktor 了,或者类似的创建方式都是一样的, 先写一下这个容器的名字啊,然后再来一个监控号,监控里面放的是你想往这个容器里面存的数据的类型, 然后再给你这个容器起一个名字就 ok 了啊,就是你创建的这个队列起一个名字就完事了,这就完成了创建工作。接下来我们要学习这里面的六个接口,这六个接口给我们自己实现这个队列里面的六个接口是一一对应的,所以说大家看这些接口的名字跟我们之前学过的一一对照就 ok 了。 第一个是 size, size 就是 返回队列里面实际元素的个数,然后是 empty, empty 就是 返回队列里面是否为空,这两个接口的时间复杂度都是 o 一 级别的。 然后接下来就是 push 和 pop, push 就是 入对操作, pop 就是 出对操作,时间复杂度也是 o 级别的。然后接下来就是 front 和 back, front 就是 返回对头元素,但是是不会把对头元素给删除的, back 返回的是对尾元素,同理它也不会删除这个对尾元素, 时间复杂度也是 o 一 级别的。好,那接下来我们就写一下代码,测试一下我们这个 q, 同时再学习一下这个如何使用。我们接下来测试的时候,为了凸显这个 q 的 强大,我们接下来就不不不往里面存一个整形了,我们往里面存一个 pair 类型的数据。啊,好,我们来测试下我们这个函数, 我们直接在这里先先先先创建一个文件吧,就是 q 的 使用点 c p, p, 待会我自己把它分成文件。好,我们先包含一下同文件简号 include l s, t r e, m。 好, 这简号 include q u u e names p s, t d。 好, 这里是测试 好,我们这里啊,为了凸显它的强大,我们往这里面存一个 pair 类型,我们把这个 pair type define 一下啊,里面存的就是一个 pair, pair 里面就是存了两个整形,所以我们把它呃就是重命名为一个 pi i 就是 一个 pair 类型啊,里面存的是两个 int 的 意思。好,那我们创建一个队列, q u e o e 里面你放的数据类型就是一个 p, i 就是 一个 pair 类型,然后搞一个 q 出来,然后接下来我们依次往这个队列里面插入一些元素,我们直接插入十个吧,然后继续哎,从一开始,然后哎小于等于十,好,哎,加加 好,然后直接 q 点 push, 然后插入的时候,我们因为是一个 pair, 所以 我们这里放了一个花括号,然后把你要插入的元素放进来就行,我们这里插入一个 i, 然后再写一个 i 乘十吧,啊,就是依次往这个队列里面插入一个一十和二二十,三三十,四四十啊这样的一组 pair。 然后接下来我们来测试一下,当这个 q 里面有元素,就是当这个队列不为空,就是一个感叹号,然后 q 点 empty, emppy 啊,这两种写法是等效的。然后接下来我们拿出对头元素,那我们搞一个 auto auto t 是 等于 q 点 front, 好, 拿出对头元素之后,然后把对头元素删掉,那 q 点 hop, 好, 然后拿对头元素之后,我们打印一下这个对头元素的,对啊,对头元素里面的打印一下这个对头元素。因为我们这个对头元素是一个 pi, 所以 我们直接这样子输出,就是 t 点 first, 然后再输出一个空格,然后再 t 点 second, 然后引低 l, 好, 那这就是我们的测试函数,我们看一下打印效果。 好,然后刚开始是一十,然后是二十,然后是三三十,然后最后是十一百,没有问题啊,说明。我们依次往对列里面插入了一个呃呃 a 以及 a 的 十倍,然后 a 以及 a 的 十倍,然后最终输出的也是 x 以及 x 的 十倍,没有问题。好,这就是我们的 q 啊,到这里就已经讲解完毕了,接下来我们来讲解对列里面相应的算法题,我们下一个视频,再见。

刚刚得到消息,二零二二年度美国生活方理学会正式授予我院士的这么一个荣誉啊,我也是在美国第一个华人获得这个荣誉, 这容易啊,离不开大家的支持。刚才这位患者朋友也是个粉丝朋友,对我表达了祝贺和感恩,马教授,祝贺您当选美国生活方式医学二零二二年度的院士,您在生活方式医学领域取得了巨大的成就, 让我们这些患者得到了实实在在的益处,真的非常感谢你,马教授,我最近的状况我给你简单的说一下,嗯,我的体重恢复到了以前的体重,然后那个脂肪变也没有了, 谢谢大家的祝贺祝福。通过马教授在线上的长达三年的公益科普,很多人受益啊,这是其中一位,他的很多慢性疾病 得到了有效的康复,各个方面都在全面提升。我想呢,公益科普是我们全民健康的重要的基础,生活方式医学是全民健康的出路,健康中国必须全民健身,健康生活方式生活方式医学在二零一七年在美国开始啊,专科认证考试, 那么到现在已经进行了五年,越来越成为医学的一个新的发展方向,也可以说是一个医学的未来。 我希望我的朋友们全民一起啊,携手推动生活方力学在中华大地的落地生根,促进全民健康的发展。再次感谢大家的关注,我们同喜同贺,谢谢大家。


第一次参加 a c m 竞赛,同学啊,我给大家一个呃小建议小技巧,可以能帮助你们,也许能拿到更好的奖 啊,就是 a c m 竞赛,首先你要知道它是现场三个人一台电脑,然后呢,在五个小时之间解决八至十二道题,全大题,注意啊,是全大题,不像蓝翔兵那样是有填空题,小题的,全部是大题, 并且呢,一般来说都会有那么一道两道的千道题的,就是比较简单的题,所以如果能把那千道题都先做出来的话,你是也有可能拿奖的。做的快的话啊,那么 需要注意是那些简单的千道题并不一定在前面,也并不一定在后面,或者在哪个特定位置,他是随机的,所以这个时候你要注意啊,如果你又赶上英文题,所以你要看哪个题,你就有点 呃耽误时间了。这个时候有点小技巧,第一,你们三个人一人,每个人都会有一个纸质的这个材料的,一方面你可以看这个去分工,去看哪个题简单。再一个,还有办法教给大家就是, 正常你每做出一道题来,都会有志愿者在你的桌子面前插一道插一个气球的,就是每一个题会有个不同的颜色的气球,你如果做的慢,那你就看现场,现场整个场馆望,放眼望去,你看哪个颜色的气球最多。那个题一般就是水题, 听懂了吧,那就先做这个题,你看,比如说黄色气球,最多你先做黄色那个气球,对,是 a 题或者 e 题就去做,所以你只要把这个水题千道题搞到手的话,一般来说做的快也是很有可能混一个奖回来的啊,记住了。

今天分享一道例扣上的经典题目导语数量,我们如何通过勾朗还有 a、 c、 m 的 格式让它输入输出呢?首先看下题目,它就是说一代表陆地,零代表水,让你输出一下它的导语数量,需要注意的是这个一和零它都是 bit 类型,而不是 int 类型的。首先看到这类网格的题目, 呃,咱们最开始想到的就是要么是深度优先搜索,要么是广度优先搜索,最经典就是这两种方法。然后咱们 a c、 m 格式的话,是需要自己去构建输入和输出的, 那么大家来看一下。首先咱们先建立一个标准的带缓冲的一个输入的一个通道,这个地方一般写 new reader, 然后一个自己带缓存的一个标准的一个输入通道 out, 一个标准的输出的一个通道也是带缓存的,这个地方应该是 new writer, 然后呃,让它们最后在输出的缓存的通道可以同时 输出出来一个 auto flash。 如果你想保证它一定能运行的话,最好还是加个 default 关键字在 go 里面, default 就是 说我程序快崩溃了,我也可以将这个 default 这个语句进行执行。我咱们看一下它这个立扣上的这个的一个输入输出的格式, 咱们先构造,咱们先构造一下输入和输出的样子 柜子,然后让它等于 make a, 这个是 bit 类型的,然后它是 m 的 一个长度, 写一个循环,然后这个地方咱们呃 great, 让它的 i 等于一个 make, 让它这个让它这个里面这个数组也是 big 类型的。我长度是长度是 n 吧, 这个地方定一个 n 吧, 然后 four, 嗯, j 等于零, 呃, j 小 于 n, 这个地方还是要再定一个括号类型的,因为这个它里面是 beat 类型的,所以咱们不能直接复制。然后比如说,嗯, 你要输入一个四个 f, 四个 f, 第一个通道是你的读的字,读的通道咱们就是 in, 然后呃这个地方咱们放到 s 这个地方,然后咱们让它等于一下 great 的 i i j 等于这个字母串的这个东西, 然后咱们输入,咱们算是构建,构建结束了,构建结束了,对,然后咱们再看一下输,输出, 输出咱们怎么构建呢?输出就是通过这个这个函数里面的,然后这个这个函数咱们应该怎么写呢?呃,先定一个 answer, 呃,他,哦,他最后要的是 ins 类型,不好意思啊,要的,要是 ins, 咱们就用 answer 就 行了。然后,呃看一下它的长宽, 然后,呃这个地方咱们用那个深度优先搜索吧, 这个里面要传的是他的坐标,然后不返回了,不返回东西。然后 我需要注意的是这个地方,呃,因为在 go 里面,你不能直接去定义并且使用这个币包,就这个匿名函数,你必须得将它分开才行。分开,你先定义一下,然后你再进行执行一下才可以, 我想想怎么写。然后如果这个 great 岛屿这个东西,呃,这个东西它等于,呃, 呃,等于,哦,不行啊,咱们先给它判断一下,如果这个 a, 呃,它小于零,或者这个 a 它 大于等于,呃 m, 我 看一下是不是对,咱们先都定成 m, 或者这个 j 它, 呃,小,小于零,或者这个 j 它大于大于等于 n, 这就代表它已经越界了,咱们就直接返回就行了。 reton, 因为咱们没有需要返回的这些类型,直接写 reton 就 行了。然后如果碰到了这个这个东西,哎跟 g, 它如果等于呃它如果等于水的话,咱们就直接呃,跳过就就会 return, return 也可以,如果反而不是的话,咱们就把它改一下, 就是说如果咱们碰到落地了,咱们就把它改成水,因为如果要防止它进行连接,咱们只能算一次嘛。这个为什么会有问题呢? 等于不是一个 is not use i, 这个不是判断的,这样写对的,呃,然后这个 if 里面怎么应该也也要出来了, 然后咱们再给它上呃,上下求索一下,就是上下左右咱们都得给它来上。 然后这个写完了,咱们再写内层的嵌套循环,开始一个一个便利。 if if greet 它这个东西它如果是呃它如果是等于陆地的话,咱们就给它 answer, 大家,然后再把它送到这个里面去,送到这个呃,咱那个咱们定义的这个函数里面去,我看一眼,然后 return 一下, return 一下 answer, return 一下 answer, 咱们整体来看一遍, 这个应该这个地方应该写 s, 不好意思呃,然后咱们看一下它输出个什么东西,输出个 int, int, 咱们在这个地方咱们定一个 answer 吧。 answer 咱们就等于 member iceland, 这个地方需要传入一个二维的比特数组就可以了。我咱们再 return 一下, return 一下 answer, 这不是今天定定一个 answer 呢?咱们来看一下能不能跑呢? 咱们拿一个标准的一个输输入来看看,对,是可以跑的,没有问题啊,没有问题。 呃,所以咱们复盘一下,呃,这个岛屿的这个岛屿数量问题,它其实就是网格的二维一矩阵,咱们要么用那个深度优先搜索,或者说广度搜索优先 之类的,然后构建标准的输入输出,你最好是带上这个带缓冲的一个标准的通道,一个带缓冲的一个标准的输出通道 之类的。然后包括这个地方一定要写 return, 就是 它,如果不它,如果不是它,如果是这个呃水的话,你一定要写 return, 不 然这个内存会爆掉的。