经验总结
做题经验总结
算法竞赛对其参与者的要求:
具备较强的问题抽象和建模能力,能实现对复杂实际问题的模拟求解
迎难而上,方能成长。念念不忘,必有回响!
-58.好多题数据n上限都是1e9(10亿,int上限21亿),今天遇到这样一题,一直WA,后来发现我有个3 * n的操作!!!
-57.有些样例(像是codeforces上的)不怀好意,故意引导人按照一种错误的思路去考虑,从而WA.
-56.我才发现,二进制运算 | & ,在状态压缩中,0代表无,1代表有,此时 | 对应取并集∪, & 对应取交集∩.
-55.阶乘取模,很可能从某项开始就是0了!
-54.从n到1不好算,试试反着来,从1到n。
-53.有乘有除的double运算坚持先除后乘,免超longlong!痛死
-52.不要自我感觉不会超int,就一个ans能开long long就开呗!
-51.多者选其一的贪心可简化为二者选其一,多测试几个”二者选其一“哪个更优,得出贪心方案
-50.猜出可能是贪心,可不明确贪心方案时,举一个简单的例子(>=3),手动枚举出所有方案,看哪个方案最优,猜测那就是正解
-49.当你确定思绪乱了的时候,敢于重新整理思路重新写
-48.题目叙述较长时,第一段多为题目背景,可忽略,若读完其他段有疑问可去读一下
-47.写了init函数,主函数里没调用就交上了……
-46.PE:Print a blank line after each test case.
-45.我就是个傻*,多次将i写成1
-44.T多(>=1000测试组数)想想预处理
-43.注意输出格式”Case # 1: “,大多数人做题时不管这个,只注重算法是否正确,当时间一长或思路正确而感到激动,往往忘掉了输出格式,多罚时20min
-42.较短的数字串可以当做数字处理
-41.输入(Input)可能有重复的内容
-40.代码能过样例和极限边界值却不能AC:去Discuss区看看
-39.special judge的题抓住刺眼、奇怪的特点去思考
-38.但凡有点思路就跟队友提出来,即使没有最终方案,也可以启发队友想出新策略
-37.遇到段错误(Segmentation Fault 、RE)而又不知该如何修改时,可以试试用map代替数组
-36.不要一遇到问题立刻转为数学题,有些是有实际意义的!比如你赌博(不可赊欠的那种),前四天每天输一元,后三天每天赢一元,你以为最开始只需一元的本金吗?天真…找到过程最低谷!(—++过程中最负的值即为一开始必须要有的值!) 实际问题相对于数学模型的最大特点是:不赊欠
-35.有时候除法能改为乘法(如:两比值比较大小),从而避免了卡精度问题
-34.手推出一般规律后,拿‘5’验证一下,有时候‘4’都不一定可靠
-33.在涉及取模的题目里,任何一步加法运算都要注意取模(特别是在特殊处理、结尾处理的时候)
-32.有时候初始化的值对应答案!所以慎重初始化,并检测初始化值作为答案是否符合题意!
-31.用输入挂前若需
getchar()
一定加上,不加可WA-30.
int n; scanf("%d", n);
漏了 & 编译器不报错-29.平日做题遇到想不通的地方暂且搁置或问一下别人,相信阿基米德与酝酿效应,硬刚浪费时间还伤身
-28.条件判断时 >= 别漏了 ‘=’
-27.对于int型奇数n来说,n / 2 4 != n 2
-26.有些乍一看很不可思议、无从下手的题往往过于简单,用最简单的0、1、2带入’暴力赋值法’(选择填空必胜法宝),这样的题要大胆猜想、敢于尝试
-25.二分的l、r改变条件要写的简洁(那才是真的懂二分)
-24.凡是暴力遍历超时的,都可以想想二分优化(l、r的改变写好,否则易死循环)
-23.做题遇到从文件读入…freopen(“input.txt”,”r”,stdin); freopen(“output.txt”,”w”,stdout);
-22.平时1e4的期望内存开大十倍就行(除非内存限制很小)
-21.上下两个边界都要试一下
-20.程序简单取模复杂用JAVA
-19.有些题目看上去很复杂,实则是在掩盖它本身很简单这一事实,为了达到这一目的,它给的提示往往是去误导你,误导你把问题想复杂些
-18.T组测试数据,当T>100以至于1e5时,考虑预处理
-17.i、j、k下标密集区,下标看清楚写的是不是自己想要的
-16.有想法先跟队友商量一下,确保可行后试敲
-15.很多题有T组测试数据,样例输入却只一组,自己检查每组进行前是否各值已初始化!
-14.运行除法时 / 考虑分母是否可能为0,否则运行出错RE
-13.敢于读题(即使面对一篇冗长的阅读理解,有时不必全弄明白)
-12.数组开小了,非法访问未知地址的内容会TLE!
-11.数据量大时,强行用较高精度代替较低精度输入会TLE!
-10.无 结果输出 又没有 程序结束提示 :大概是死循环
-9.debug要有!针对性!抓要点!不盲目地改,效率低!
-8.if并列关系要列的清楚明白、层次分明,不要乱if
-7.输入一个数字,程序没运行直接返回一个异样的负值,很可能你的 scanf没有&
-6.当变量设置较多时,适当注释。
-5.数组开的大又不止一个会溢出,不等你输入直接结束程序
-4.特殊样例:逆序输入、重复输入、0、+1、-1 !边界值!
-3.思路清晰,写在纸上,可减少出错
-2.注意是非负整数(包括0)还是正整数
-1.在wrong answer与presentation error同时存在时可能先报presentation answer!
0.sacnf(“%lld”,a[i])没有“&”不报错但!
1.Time limit Exceeded(超时)缺少 !=EOF
2.数组适当开大一点,题目数据小的话开大10倍
3.细心!p!=np(输入p与n而非np).
4.分类讨论时 注意对应、对称性!
5.if(a==0)两个= if(a[i] == a[j])让这个==害惨了
6.赋值 temp==a[i] 无语……
7.原来循环中可以计算a【i】有多少被赋值(循环中计数)
8.不能只想,要一边想一边写,成功几率更大
9.特殊样例:注意0与负数与常数列的输入检测.(某些值结果若是0等特殊数字)
10.英文注意Multiple test cases.
11.有错误可用手机检查一下?
12.花样自造输入样例.
13.鼠标拖动选中Sample Output测试末尾有无空格
14.输入一个数字就对Ta操作,可不开数组,或许省内存、思路更清晰,但耗时间?
15.int 比 long long 省空间还省时;尽量不用endl因为耗时!
16.if(flag) 这里flag即使为负值也被算作1,if只能判0与非0
17.当你知道某题用到的知识点是你没学过的,那就直接去看题解,学会这个点,A过这道题,不要犹豫,这是应该的
英语单词学习(ACM相关)
有时候不愿刷题真的是因为题面是一大片英文……就跟饭菜不合胃口似的,想吃点又吃不下……
学以致用才是真正学到了。单词学完了用到句子里、文章里;数据结构、算法学完了用它去解题;函数、库学完了用它去做一两个简单的项目,这样才能记住些东西。
如果你学习一个知识点不去实践、应用,根本记不了一两天,还不如不去浪费那个时间!
- bidirectional /,baɪdə’rɛkʃənl/ 双向的 example: a bidirectional path
- adjacent /ə’dʒesnt/ 相邻的
- respectively /rɪ’spɛktɪvli/ 分别的
- radius [‘redɪəs] 半径,半径范围
- contiguous [kən’tɪɡjuəs] 连续的;邻近的;接触的
- horizontal [hɒrɪ’zɒnt(ə)l] 水平的、水平线,水平面;水平位置
- lexicographic [,lɛksɪkə’græfɪk] 字典的;字典编纂的
- troop [truːp] 军队;组;群;多数
- pasture [‘pɑːstʃə] 牧场;草原 吃草 放牧
- quadrant [‘kwɒdr(ə)nt] 象限、四分之一圆
- decimal [‘desɪm(ə)l] 十进位的,小数的
- lexicographically [ˌleksɪkəˈɡræfɪklɪ] 按字典序
- boundary [‘baʊnd(ə)rɪ] 边界;分界线
- indices [‘ɪndɪsiːz] 指数;目录(index的复数)
- scenarios [sɪ’nɛrɪ,o] 情节;情况 (≈cases)
- decimal [‘desɪm(ə)l] 十进制的、小数的;小数
- rational [‘ræʃ(ə)n(ə)l] 合理的,有理数(rational number)
- finite [‘faɪnaɪt] 有限的
- invalid [ˈɪnvəlɪd; ɪnˈvælɪd] 无效的、病弱残的
- syntax [‘sɪntæks] 句法
- Trajan [‘treidʒən]
- identical [aɪ’dentɪk(ə)l] 完全同样的,相同的;恒等的
- specification [,spesɪfɪ’keɪʃ(ə)n] 规格;说明书;详述
- performance [pə’fɔːm(ə)ns] 性能;绩效
- diameter [daɪ’æmɪtə] 直径
- radius [‘reɪdɪəs] 半径
- precisely [prɪ’saɪslɪ] 精确地
- arbitrarily [,ɑrbə’trɛrəli] 任意地
- cryptography [krɪp’tɒgrəfɪ] 密码学
- diagonal [daɪ’æg(ə)n(ə)l] 斜的,对角线的
- overlap [.əʊvə(r)’læp] 交叠、重叠
- unidirectional [,juːnɪdɪ’rekʃ(ə)n(ə)l] 单向的 (对比undirected无向的)