(写于 2014年 11月 23日)
从昨晚打BestCoder到今天的Running IT Youth(定向越野编程比赛),各种卡题痛苦挣扎过后,现在来稍微小结一下:
目前找到的卡题原因大概有如下几点:
1: 就是个可恶的输入输出问题,先说long long的,定义一般直接用long long去定义就行(也不知__int64来定义会不会依赖于不同的操作系统),然后就 是输入输出的问题了,建议在所有的window系统中都用%lld来进行输入输出吧(无论自己的电脑还是图书馆用这个都没问题,貌似64位的系统%lld和%I64d都可以,但图书馆的32位就不行,一定要%lld,若用%I64d的话读入就绝对出错,切记了,昨晚卡了好久,调试了好久 T.T),然后提交时就看准OJ上的要求了,所以以后如果得出一些莫名其妙的结果的话,不妨来查看是不是自己的输入输出写错了,总之无论用什么电脑都好一开始就用%lld来输入输出,然后到了提交时再把这个改为题目的要求即可!
1.1:今天的Running IT Youth中的白板编程,就是裸编,不能用IDE,也不能编译调试(就是说即使你会在DOS下编译运行也没用 T.T),然后有道贪心的水题(广外的几乎所有题目都是水题,即使很暴力也能过),然后我提交后竟然超时了,我就想数据量小得可怜再嵌套个循环也不成问题的啊,怎么会超时呢?我想是不是算法错了呢?但贪心已经很高效的了,我改了一些细节(比如提早跳出循环)后再提交还是TLE,于是我想有可能数据溢出?还是……和队友(是个美眉来的~)嘀咕了一下后忽然找到了,原来就是scanf函数中出错,读入两个变量却只有一个"%d",怪不得有问题。要是能用IDE的话这种错误完全可以扼杀在码的时候的……没办法,白板编程,就是这样的了,语法错误,逻辑错误,程序运行结果……一切都靠用肉眼看,还是对着没有高清亮凸显和几乎挤成一堆的代码 T.T,也好,下次我也用这种方法来训练自己,在广外OJ这个水的平台用这种方法也不会很吃力。
2. 第二个就是昨晚BC的签到题,就是在素数筛法这里出了问题。有种想扇自己的冲动了,暑假不知投入多少时间在数论这块了,竟然还会犯这种二逼的错误。具体就是标记数组vis[]和素数数组prime[]开的大小出了问题。说实话,现在也还没搞清,小白书又不在手,以后再回来补充。总之当异常退出时很可能是数组越界了(当然栈溢出,除0,mod 0也会,但素数筛法的存在使数组越界的可能性被放大了),以后码素数筛法时一定要很注意vis[]和prime[]数组的大小对应关系!!
(后来这道题在艰难地处理好越界问题后过了小数据的测试,却被别人机智地hack了 T.T,没别的原因,因为数据规模的上限我也有考虑到,却偏偏忽略了最特殊的边界数据:1不是素数!本应输出0的我却输出1,也罢,一时头脑发热是这样的了)
3. 再有就是局部变量的数组初始化,凡在函数体内开的数组在使用前都切记要清零!不仅因为声明时会自动赋予不确定的值,还因为该函数会被多次调用的,故如果程序的运行结果很奇怪的话也不妨来检查下这个,检查清楚每个函数体内的数组是否清零(推而广之,即使是全局变量的数组还是各种简单的变量,在函数体内使用前都切记要重新初始化,虽然还没因为这个卡过很久,但也不要把这个成为以后的风险)。
先写到这里吧,以后再来补充。
(PS:今天的定向越野编程比赛确实收获不少 ^0^ ,可爱的两位部长,养眼的师妹还有个不断给我戴高帽鼓励我的师弟,虽说最后还是让他们有所失望,只A出一道,但我想没有爆零也算是大神保佑了,嗯嗯,一定是因为今天的亚洲区域赛广州赛区的师兄们也在coding and thinking,我才能被他们保佑哈哈……)