昨天布置了一套题,CTSC1999,01串统计,补丁程序,家园,希望大家明天一起交流讨论,每个题目都做到100分。
早上大约八点到达学校,先处理了一点其他的事务,再去看同学们的时候竟然没有人做题,很是生气,叫到空教室
1、在长沙,长乐等地方培训的小孩说说自己的体会:
I 有些题目根本不知道算法
II 有些题目知道算法,但是不知道怎么写出来
III 有些题目知道算法,写的时候总有细节问题,出来的结果不是自己想要的
2、我来说说对策:
I 不知道算法的题目是大家研究的太少了,比如:平面图判定,概率DP问题等等,这个是要学习的,说明我们要看书,不能每天做题,除了张珈尓同学外我就没有看到哪位同学看书?这个不可理喻。难道都懂了天天做题?
II 有些题目知道怎么去做,但是写不出来,比如:斗地主,智慧连环珠等,症结在于状态表示,规则表示程序化等不到位,(考试时候可以硬写,一条条的规则,一个个的状态打表,也许打着打着你找出规律了呢?) 所以平时大家做完题目之后要思考,为什么要这样,8皇后本来是二维数组为什么一维就搞定了?杨辉三角,螺旋方阵为什么要那样,我平时的虚拟岗哨是怎么用的,体会这些计算机编程基本技巧,形成自己的条件反射。斗地主和智慧猪游戏其实不难,是大家不愿意做民工题目,这个要克服,你背单词背作文不就是这样的吗?
III 细节要锤炼要总结,很多小程序我给过你们标程,那是经过了考验的,你们要背他们,平时不能随心所欲的写程序,因为你们的水平不到随心所欲的地步,哪怕做完一道题,事后也要思考一下为什么这么写,还能不能做的更好?看看我的那些程序 体会一下为什么要这么写? IV 数学思维可能跟不上,唯有训练。
3、交流一个题目:(我只说了第一问)现在我们有一个长度为n的证书序列A。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。输入(sequence.in)第一行包含一个数n,接下来n个整数按顺序描述每一项的键值。输出(sequence.out)第一行一个整数表示最少需要改变多少个数。第二行一个整数,表示在改变的数最小的情况下,每个数改变的绝对值之和的最小值。
Sample input4 5 2 3 5
Sample output1 4
90%的数据n<=6000。100%的数据n<=35000。保证所有数列是随机的。
今天希望大家一起讨论的是CTSC,许同学很认真的全部做完了,当然看了题解,据他说,第一题和黄同学讨论很很长时间是一个组合数学的问题,但是似乎超出了我们的数学认知,他是看了题解才知道的,不看题解是不可能想的到的。但是我认为可能是训练不够,要是能多打点表,多看几组数据找找规律不见得找不到。而且,思维能力可能还没有到一个新的境界,小孩子看不到1,2,4,7,11,16的规律或者Fibo的规律,或者polya的规律我们应该看得出来,这需要训练。
第二题居然是SPFA,那么他是如何设计的,为什么穿上了美丽的外衣你就看不出来了,这要好好反省。这刚好对应着前面说的第一点,不知道算法。其实不是不知道,是没有悟到,难度在哪里,数学建模!
第三题是标准的网络流,估计会做,但是完全是自己默写出来的行不行?考试是不能看书的,现在就要训练这种比较长的程序。据黄同学最后的反馈,程序很长时间都是错误的,许同学帮忙,最后找到问题的症结了,maxn写错了!!!我一向反对直接m,n的,我喜欢用 row column position value,你们没有学过软件工程,体会不到,杨同学以前很 犯过好几次这样的错误的。
张珈尔和杨易龙认为第一题可以DP 但是现在没有找出来规律,其实组合也是递推的。
雷同学第一题打了个暴力,后面的没做。
附上大家的总结:
许楚豪:
CTSC1999 day1 总结
01统计是一道具有较高思维难度的组合计数题。此题的切入点为如何灵活运用组合计数中的加法原理,对01串进行分类计算。
我做这道题的时候并没有想出与正解类似的思路,所以只好使用复杂度稍大于O(n)的暴力算法,实际证明还是不错的,可以过50%的数据。
看完这道题的题解给了我很大的启发,进一步培养了在组合计数方面的思维能力。
(不仅仅是组合,还有其他的数学)
这是道及其神奇的spfa技巧题。
不过与我们一般做过的spfa题目不同,此题需要将可能达到的各种所含漏洞状态压成一个int类型,在可以转移的漏洞状态之间连边,边权为相对应补丁的修复耗时。
其实类似的题目我以前也曾碰到过,有一题是给定一个序列,可以通过spfa建模,把某一位跳向另一位的动作看成两个数位之间的连边来处理。这两题有异曲同工之处,只不过本题在状态设计上更为复杂,不过如果有一定的状压dp的做题经验应该能想出此题的建模方法。
(建图的技巧:数学建模的重要性,你们忘记了我说的两个题:狼羊人白菜过河,包含0000-1111的最短01序列,好好体会)
这是一道十分经典的最大流建模题。
本题的最大思维难度其实不太常规。通过枚举任务完成的时间(如果超过一定时间还不能完成则视为无法完成),把每个站点按照所经历的每个时刻进行拆点,对于每个产点,从上个时刻向当前时刻连一条正无穷的边,对于每条线路,从上一个时刻到的点向当前时刻到的点连流量为飞船最大载荷的边。通过以上建模即可快速解决。
这道题是到很好的网络流建模题,主要是通过拆点实现的,能帮助我们在以后的网络流题目中提升拆点技巧。
王证儒:
2017.3.23 总结
昨天晚上,孙老师打算让我们第二天做 CTSC1999 day1 的题目,并要求大家先一起讨 论,然后再各自写代码,并做到满分。但当我第二天来到机房的时候(我来的比别人稍晚一 点),发现机房如同往常的寂静,大家似乎也没有讨论题目的意思,又因为没有人监督也没 有人提出什么,大家就都在做自己的事情,全然没有顾及孙老师昨晚布置的任务。在此,我 应该作自我检讨,我没有发动大家,当了一回懦夫。 之后孙老师非常生气,把我们大家召集起来开了个小会,跟大家交流了一下,也总结了 一些我们平时遇到的问题。对于我而言,我知道的算法不少,但真正能够考试临场写出来 1A 的,大概和大家也都差不多,有些甚至还不如别人。所以有些题目我明明知道算法和大概思 路,可往往因为代码能力不够以及细节问题无法 A 掉,通常都只能写暴力分,另外一些自然 就是那些连门都摸不到的题目了,比如莫比乌斯反演、高难度 DP 等等,应该是我的数学功 底还不够,很多东西也并不了解,思维还没有到一定高度。至于今天孙老师交流的一道题:
由于我听错了题目,以为是不要求严格递增的序列,即不下降序列,所以当时我就想了,这 不就是个贪心水题吗,求最长不下降子序列的长度,一减就好了啊,于是脱口而出,然后就 悲剧了(还好没有被批判一番)——毕竟我看错题目了,要求严格递增,那就是 LRJ 书上的 题目了,由于要严格上升,那每一个数都要至少比前面一个大 1,那么使每一个数减去一个 公差为 1 的等差数列(实际上我们减的就是 ai=i),然后对新序列求一遍最长不下降子序列 就好了。所以啊,我们还是要考虑到历史的进程,这一题原本我会做,可是由于没有仔细听 题目,结果就弄错了。如果这是考试,那我可就闷声作大死了啊。 下午才正式开始看 CTSC1999 day1 的题目: A.01 统计 求[1,m]中满足其二进制表示中 0 个数大于 1 个数的数的个数(m<=1030)。 刚开始看到了第一反应自然是打表看看找找规律,但打了表之后发现并没有什么用,很多相 邻的值都是相同的,不严格递增,然后就没有什么别的特点了,后来想了想,0 个数大于 1 个数和 1 个数大于 0 个数是等价的,那我们不是只需要求出 0,1 个数相等的数的个数然后用 总数减去再除以 2 不就好了吗,当时这样口胡了一下感觉没毛病,但是不知道怎么下手,所 以就没有去写了。
B.补丁 vs 错误 m 个补丁,每个都可以用 pi 的时间修复一定的错误并带来一些新的错误,要求用最少的补 丁次数修复已有的所有 n 个错误(n<=20,m<=100)。
一眼题,很明显可以将每个补丁的错误集合压位,然后将每一个状态看作一个点(最多 2n个 点),枚举一下连个边,然后跑一遍最短路就好了。
C.家园 看了看是个我不会的图论建模题,那多半是网络流了。 而我网络流的题做的很少,所以预计并不会做…题解看懂了就也没有什么难度,但估计下次 还是不会做,感觉网络流博大进深哇……
总的来所 CTSC1999 day1 的题目是有一定的难度的,但和当今的省选、NOI 还是比不 了的,CTSC、WC 就更不用说了。 这三道题如果做下来,对我是有一定的提升的,比如 A 题,听说 ZJE 同学的 DP 做法我 觉得我肯定是不会的(起步晚,DP 题做的少,最主要的是现在省选几乎不考 DP 了),不过 XCH 同学的组合数做法还是很兹磁的。B 题的话大概就是个套路题,也做过一些差不多的。 C 题的话,由于一些网络流的题思维难度极高,所以我还是乖乖码我的码农题练练代码能力、 调试能力和数据结构能力算了(摊手+白眼)。
离省选只有区区 20 来天了,我觉得最后的日子里,我应该要把以前会的东西巩固一遍, 保证会的都能做对,暴力都能拿到分,至于一些以前不会的东西,就可以简单看一下,琢磨 一下暴力怎么打…毕竟现在学新东西不太现实,必要的话肯定是(如果)进队后再学了。