不打代码系列

SCOI2015Day1

解题过程

T1:BZOJ4445: [Scoi2015]小凸想跑步

*不能在同一行或者同一列
可二分+网络流

建模:
把行、点、列都看做点
1、源点连接所有行流量为1
2、每行连接所有该行权值为0的点,流量为1
3、所有权值为0的点连接对应列,流量为1。
4、所有列对应点连接汇点,流量为1
最后检验最大流是否>K

T2:BZOJ4444: [Scoi2015]国旗计划

算法可能:间覆盖问题(贪心),DP,图论

M可以离散
*所以每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含。
*数据保证整个边境线都是可被覆盖的。

1、破环,将区间按照左端点排序,不跨端点的区间需要两次。
2、每次考虑选择第一个区间的答案,向右贪心眼神一直到长度有M,就是答案
3、取出第一个区间,加入下一个区间(如果已经加了就不加了)

T3:BZOJ4445: [Scoi2015]小凸想跑步

计算几何
让0,1这条边和所有边取角平分线(要求原向量在左右两侧)
做半平面交

算法流程

T1
  1. 读入
  2. 二分答案
  3. 网络流检验
    时间复杂度O(3*N*M*30),且只有三层
T2:
  1. 读入数据,并且对于没有跨M的进行复制,且点全部加上M,并且按照左端点排序
  2. 维护一个队列计算答案
    时间复杂度O(n),可以不用离散
T3:

算法流程
1、读入,把0,1对应直线和其它所有直线取进行角平分线,注意判断平行
2、对于这些点做半平面交
3、求出半平面交的面积以及原来的多边形面积作商。

正确题解

T1:

实际上只需要两层,二分图匹配即可,是把点看成边,行列看成点的网络流类型。

T2:

然而网上说倍增,因为每个结点数量是一定的,我觉得我这个也不错啊,实现一下,反正不难。

我的方法是错的,因为如果第一个元素变换了, 那么后面的一个元素选择就需要变换,从此造成连锁反应,因此根本就不能用队列维护。

正解是一旦选择一个元素之后,后面选择的元素就可以确定了,因此我们已经弄成了一棵树,可以倍增求。

T3:

看了题解发现还要把01这个直线加进去。。我的错咯

思维反思

今天还是没有贯彻解题方法,第二题没有自我hack的过程,也没有多方位思考,造成算法错误,第三题由于没有手动跑样例,忽视了一个细节,按照我的解题方法是完全可以避免的。

其中第一题虽然有更好的方法,但是我的方法也是可行的,如果在考场上应该算是没有问题,不过启发需要对算法进行一个精简的过程,看看是不是有个更好的办法。

今天的最大失误是第二题,这道题本身不难,但是想到了错误的地方并深陷其中,如果正式考试,大概后果是会浪费两个小时并且爆零,基本上整个考试就翻车了,我认为这绝对是不能忍受的。

解决方法如下:首先想暴力算法,这道题的暴力算法可以说比较简单,比最一般的区间覆盖还要容易,基本上就可以得到一个基础分了,即使差一点不至于毫无希望。而如果这道题成功想出了暴力算法,那么对于我的解法应该会有所怀疑,也可以更好的想到正解。

关于对拍的问题:我认为对拍的确是需要的,但是之所以不想对拍,是因为暴力和数据生成不好写,我承认这是个麻烦的过程,但是它消耗的时间是非常少的,而且暴力应该是必须要打的。

最后是时间分配,今天算是承认Mr.He提到的,我们需要先打暴力,而且要打简单的暴力,这样有一个保底的分数,的确不该以来就弄正解,之前心太大了,就算弄出了正解,也不能保证正确啊。

还有个细节,就是你发现你的算法的普适性不高,而且需要考虑很多细节的时候,可能你的算法就是错的,因为你可能通过样例考虑了许多细节,然而可能还有很多样例体现不出来的细节可以卡掉你,这是需要警惕的。

还得出结论,肉眼差错比调试有用,人为hack比对拍好使。

HNOI2017 Day1

考试思路

T1:
真是奇葩题

T2:
这类问题可能比较经典哎,是处理区间元素关系的
数据结构,可离线

T3:
经过一定的转换,可以变成直接最大化sum{ai*bj}
有了这个最大值可以直接把答案求出来
想不到搞了这么久。。我居然就是把一个可有可无的枚举优化成了O(n)

总结

最后。。。。一上午就弄出来一道题。。。。
晚上一定要把T1,T2补上,明天不能这么慢了啊

没错。。。。一上午就只干了这么点事还是抄的人家的代码。。

我感觉我的思考能力坑定还有欠缺,明明只是几步很简单的推到,到了我这里似乎变成了一个大工程。

希望能够通过最后这几个星期的不打代码系列把思考能力提高。

HNOI2017Day2

8:45开始
争取到10:00结束

考试

T1:
*恰好等于 0,不能小于 0
*特别注意你的自信值为0的时候还可以继续和大佬斗争
*大佬先进行攻击
是个DP吧

T2:
这是个计算几何
数据保证合法
把障碍点按照X排序跑DP
按照样例来说,应该一直往机关点跑是最优选择
DP转移的时候应该要尽量往前的点?(划掉)
*注意端点的判定
用一个辅助数组记录当前点的转移点
首先尝试第一个可转移点,然后尝试第一个可转移点的转移点,查看是否被第一个可转移点拦截
实际效果会更好,很难卡这个算法哦,期望得分很高

T3:
有趣的mod,mod1e9是个不错的选择
*不足K位用0补全
把n!分解因数,m!的分解采取加入元素有强行加的方法,(n-m)就强行减,这两个数分解质因数最多只能分解log个元素出来,每个元素重新计算,
大概是log^n

然后对于每个元素大概要。。。n/logn*logn的时间?
然后就预处理出C(n,1)到C(n,m)了
然后用前缀和一优化,就可以了。

妈的这是个N^2算法,还不如打杨辉三角形呢!

正解

妈的以来就拿着争议最大的T2想,结果最后好像还是错的,好了先不管这道题。

T1:
第一题没认真想啊,的确很巧妙很好的一道题了。
首先求出最大怼大佬的天数,因为补血和攻击操作是没有关系的,所以可以DP求出最多怼大佬多少天。
*然后关于F和T的关系处理是很巧妙地,爆搜!!,爆搜出来状态数并不多,处理出来所有可能的值以及所需要的天数
然后用一个他们叫tow-pointer的神秘大佬算法。。。其实就是两个指针
因为不能让大佬的自信为负数,所以要保证两次直接怼的操作不能让,就用左指针从小到大,右指针随之减小,在这之前还要加一个0伤害0天数的不怼大佬情况
设大佬血量为D,伤害,天数为(d,f),可以怼大佬的总天数为C
则D-d1-d2>=0
然后有可行解则:D-d1-d1<=C-f1-f2
那么就是D-C<=(d1-f1)+(d2-f2),因此设置辅助数组g[i]表示前i个元素dj-fj的最大值,D-C<=g(point1)+g(point2)即可
注意指针边界问题即可

T2:
略过

T3:
一道数学题,然而本人还是只弄出了30分的写法QAQ
虽说我敏锐地意识到了A和B的差有文章,但是并没有料到连70分的算法都想不出来啊啊啊啊。

看不懂题解。。。妈耶。。。下次再看,多好题目

反思:
这次感觉每次考试的思考时间有些问题,有些题目需要一些时间来进行思考,然而我居然连这个时间都拿不出来。
我觉得应该很重要的一点是难度评估和大体方向,而且每个题目的思考时间应该要给得比较足够才可以。
或许可以尝试给每道题目半个小时,然后对于每个题目最好分层想算法,这样有利于之后继续思考,而且时间也不算太久,如果半个小时都无法想出来这道题,也就确实说明有难度了。
当然思考的能力的确是需要继续加强。
在思考的时候,并不要放弃部分分,因为我的考试目标大概是每天200分,而这也算是比较高的分数了,这就说明我们可能最多写出一个正解出来,然而剩下的题目,我们要做的是尽量拿多的暴力分,比如今天的题目,最好的状态应该是100+50+50,第三题即使按照我现有的水平,也是可以想出a=b的情况的,然而我并没有去做这件事,如果在考场上,可能情况会相当糟糕,也就是说我们可以通过合理的状态和策略去多拿50分以上。
而今天对于题目算法的分析也感觉到了有所不同,对于第一题,由于没有认真分析它的性质,我直接断言这是个DP题,便认为状态复杂而不管它了,事实是它是一个暴力,最后虽然用到了DP,也是很简单的DP,如果不能抓住第一题,那么这次考试就算是翻车了。
因此对于题目算法的分析,我认为应该是在对题目进行了足够的性质分析之后才能确定的,否则无异于猜了几个算法上去,毕竟类似的题目就可能会有截然不同的算法,这样分析出来的范围可能太大以至于毫无助益,也可能太小以至于根本没有囊括正确算法,这是极其恐怖的事情了,对我的方法来说,可能是个很致命的打击。
最后在日后的训练中,要注意思维的严谨性,争取一个东西想过了一遍之后就可以完全确认或者否认这个算法,而不是来来回回想很多次。这是个艰巨的任务,但是如果能够实现,将会得到极大的注意,会对思维速度有量级的提升,甚至可以延伸到生活的方方面面,因此一定要注意这个能力的培养。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值