模拟专题训练小结

本周我进行了针对模拟题的训练,在比赛中,模拟题是考察一个人代码综合能力的最佳体现,也是考验选手对细节的把握能力的有力工具。本周的模拟题大多来自WF和Regional,而前者的模拟题一般细节比较多,编程比较复杂。下面来根据我本周的训练情况来简要总结一下这方面需要注意的地方。

首先,应该完全理解题意,这一步相当关键,如果连题意都理解错了,那么后面无论花多大功夫去调试代码都是无济于事,因为你一直在实现一个错误的模拟过程。弄明白题目的全部流程,接下来就是考虑顶层设计:有哪些全局变量,需要设计哪些结构体,需要计算什么参数,需要用到什么函数,程序的大致框架应该是什么样要想清楚。比如这次基础巩固(1)中的A题,要求在棋盘上移动空格,并打印出最后的棋盘状态,因此要设计交换函数,打印函数;再比如这次训练中比较复杂的K题,模拟一个医院一天手术室,恢复室的使用状况,应该立即想到用优先队列,由于题目中有很多量都跟病人有关,因此要专门为每个病人设计一个结构体,存放他的姓名,手术室编号,恢复室编号,开始手术时间,手术时长,开始恢复时间,恢复时长;在最后要输出一个标准的24小时制的时间,因此还要为时间编写一个结构体,用于输出时和分。

第二步,仔细审题,注意题目中的细节描述,和一些隐藏的信息。比如这次的E题,要求模拟黑白棋的下棋过程,其中M指令要求“当前玩家”放置棋子,如果该位置不合法,则更换到对方玩家。同时在题目一开始题到一句话:“两人轮流下棋”,这就告诉我们处理M指令时要考虑更换当前玩家,如果不注意这个,程序就会产生错误结果。还有这次教训惨痛的K题,忘记考虑了人数为0时的情况,又弄错了题意——选择恢复室首要看手术结束时刻,其次看手术室的编号,我把次要的理解为了花名册编号,好几次WA都出现在选择恢复室这个地方。

第三步,优化顶层设计,最初的顶层设计可能会很繁琐,需要想办法优化,使之变得更加简洁。比如这次训练的I题,要求模拟一个搜索引擎,给了四种搜索的方式,输出的时候根据情况要输出dash分隔符或equal分隔符。如果只是按照题意,先根据关键词建立词典库,再建立bucket存放每个关键词的位置,形成一个表,那么程序肯定会比较繁琐,繁琐的原因是你每次都要看是否有新的关键词需要搜索,最方便的办法应该是输入文章的同时就把文章中出现的单词的位置顺便更新了。虽然这样做占用的内存会比较多,但将来查询时候就会十分的方便,只需要O(N)的时间就能查询完所有出现的位置,最后再想办法单独处理分隔符的问题,而不是每种指令都处理一遍分隔符的问题。再比如这次的E题,模拟黑白棋的过程,寻找合法位置是一个棘手的地方,如果只是罗列出8个if语句进行处理,代码肯定会十分的啰嗦。正确而高效的做法是利用常量数组(本题中也可以成为是向量数组),事先存储好8个方向的方向向量,将来就能统一进行处理了:只需要沿着dx[d],dy[d]方向走就可以了。另外还想再说说这次的A题,模拟一个5*5棋盘中空格移动的游戏,题目中提到遇到非法指令时输出相应的错误提示。如果只是单纯地先存储了所有指令,然后再寻找,就比较浪费内存,因为可能某个位置的指令非法时,后面的一长串指令都是无效的,推荐的做法是一个一个指令地读,如果不合法,后面的直接continue即可。题目中输入的数据并不一定都非要事先存储下来才行。说了这么多,就想强调一点,要善于提取问题之间的共性和特性,学会集中处理问题。

第四步,查错并修改bug。应该尽可能多的测试各种可能的情况,思维一定要缜密,考虑周全,尽可能地多思考边界情况,比如这次K题我忘记考虑人数为0的情况。还有这次的A题,超时发生在判断结束符上,有时候你写的程序不能正确地读取到结束符的位置就会发生无限循环,最终导致TLE,这点也非常值得重视。

模拟专题暂时告一段落了,但今后还会不定时地训练这方面内容,毕竟是考验代码基本功的最佳题目,打牢基本功应该是每一位程序员必备的自我修养。



时间: 2024-10-27 19:50:25

模拟专题训练小结的相关文章

面试专题训练之“双指针”

一.需要思考的问题包括以下几点: 双指针是什么,什么时候需要用到双指针 通用的模板是什么 实现过程中需要注意的细节有哪些 常见的双指针题型有哪些 二.模板整理 三.专题训练 1.Leetcode283 1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) { 4 int n = nums.size(); 5 int j = 0; 6 for (int i = 0; i < n; i++) { 7 if

藏地传奇真言专题简单小结

先来个传送门:藏地传奇-真言专题.话说搞这个专题也折腾了不少时间,看似简单的页面,实际也隐藏着大大小小的坑.下面请听我一一道来. 一.先从布局说起 真言专题页采用的布局是屡见不鲜的瀑布流.其实当时一接到这个需求的时候,第一反应是Github上搜插件库,因为关于瀑布流的JQ库实在是太多了.像KISSY的waterfall,像@Sebobo 的Wookmark-jQuery,像jQuery Masonry等,都是很简单易用的库.但体验过其中几个DEMO之后,发现其实都不符合需求的预期,于是决定自己写

基础巩固2训练小结

本周的基础巩固2训练了基础数据结构:队列,链表,树,图,以及DFS和BFS算法等.下面总结一下一些需要注意的地方. 数据结构结构基础中树是一个难点,因为树的定义就是递归的,因此解决和树有关的问题总是从递归的思想上去考虑.树的结构中最常见的是二叉树,二叉树自身有很多独特的数学特性,因此题目中经常见到这种树,比如本次训练的E题,利用的就是二叉树叶子结点i的深度depth与总结点数的关系:1<<depth.另一个经常见到的就是四分树,在处理黑白图像类的题目中经常会遇到.树的最基本的遍历方式有三种:先

专题训练之AC自动机

推荐博客:http://www.cnblogs.com/kuangbin/p/3164106.html AC自动机小结 https://blog.csdn.net/creatorx/article/details/71100840 AC自动机最详细的解释 1.(HDOJ2222)http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:求目标串中出现了几个模式串. 分析:AC自动机模板题 1 #include<cstdio> 2 #include<

ACM训练小结-柳志轩-2018年6月15日

今天题目情况如下:A题:给出若干条边的边长,问这些边按顺序能否组成一个凸多边形,并求出这个多边形的最小包含圆.答题情况:无思路.正解(某种):第一问很简单.对第二问,如果R大于可行的最小R,那么按照放在圆上的方法算出asin(li/2R)其和大于R,说明此R可以缩小.当然R也有最小值为Max(li)/2 B题:jenja游戏,介绍规则后问先手胜还是后手胜.正解:高度%3后等0后手胜,否则先手胜.这种题都有很明显的规律性.答题情况:找到规律顺利解除. C题:要求曼哈顿距离的快速迭代.正解:写出基本

ACM训练小结-柳志轩-2018年6月23日

今天题目情况如下:    D题:SG函数相关.    相关知识忘光...已复习.    E题:丧心病狂的模拟题目.    F题:树分块+容斥.    想到了树上莫队,但是糟糕的是不会O(1)/O(logn)转移,gg.使用容斥来转移,很好,会找相关题目练习.    H题:并查集+最长回文子序列.    看错数据范围+脑子懵以为不可写,事实上是个简单题目.    I题:n*m<=1e5,O(n^2m)的复杂度,很有趣的思路.    J题:点双连通分量+讨论.            教训:    1

专题训练8总结

这个专题主要学了两个数据结构 一个是线段树 一个是树状数组 线段树主要求区域操作 建树.单点查询.单点修改.区间查询.区间修改. 代码较为复杂 参考模板 树状数组  用于求和效率很高 进阶则为区域修改同一个值十分方便 主要有两种操作: 单点修改 区域查询(基础)  区域查询的差值即为单点查询   也比枚举算法快很多 区域修改  单点查询 (进阶) 1.敌兵布阵 线段树入门题   但是采用树状数组十分方便 很简单没什么好说的 2.Color the ball 一开始用线段树   debug一个me

模拟专题

https://vjudge.net/contest/270198 突然想试试这个有毒的东西. A - HTML 第一次做模拟,先试试. 1.<br>规定为:换行. 2.<hr>规定为:假如现在不是新行,则换行.然后输出一个80字符的分隔线,最后换行. 3.空格/换行规定为:空格. 4.每行不得超过80个字符,一个单词不能断开. 5.最后一行要换行. 感觉有歧义,因为没说假如最后一行本身是空行还要不要换行?那就先当他要换. AC了,还是挺简单的. //#include<bit

OO_JML专题_小结

第一部分:JML小结 一.入门关键字小结 1.引导词: requires :接下来部分的入口要求 assignable :在该程序中可修改的变量 ensures :后面是对该函数运行结束后的要求 also  exception_behavior :接下来是出现异常的处理部分 signals : 对应抛出的异常 2.转义词: \nothing :(一般用在assignable中,表示都不可修改) \everything :(一般用在assignable中,表示都可修改) \old :该函数修改前某