刷题常犯错误

整理下自己常犯错误,以后做题写完后,先匹配一下这些错误(虽然这些里面不乏脑残错误,但是有时候就是这样神奇的出错)。

常犯错误:
0.杜绝改了一项bug,就提交(每次提交前应让队友输入几组数据测试),每wa一次,应来一名队友协助debug(组队赛)。[0]
1).数组开小(re||tle||wa,线段树maxn未<<2,切记计算好数组大小,数组下标运算过程中很有可能会爆数组,血的教训)。 [1]
2).题目未指明是int还是double,强行用int (如玲珑比赛),或者题中数据间接超过(1<<31)-1,仍用的int(遇到过好几次,如cf中二分1到20E,中间可能会遇到10E+20E,int就炸了)。[1]
3).全局变量和局部变量变量名一致,造成混淆,或者定义next等非法变量(遇到过几次),(不要定义next,time,j0,j1,jn,y0,y1,yn,若是全局变量会和头文件冲突)。[1]
4).数组需清零,未清零(老毛病)。[0]
5).格式错误,如yes,no大小写,(有道题输出的结果里面含有英文句子,大致是输出需要多少物品,结果物品那个单词还有单复数不一样,结果没注意到,wa了好多次,case)。[0]
6).数组下标变量写错(结果debug老半天),for循环的边界限制写错(比如用了桶排,for循环边界却是i<=n而非i<=max(a[i]))。[1]
7).题中给定两个数字表示一段区间,未说明第一个数小于第二个数,可能需要swap(-_-)。[0]
8).输出结果double型时,直接%.nlf可能会错poj g++输出double要用%f。(可能不需要四舍五入而只是取前面几位,比如坑爹的省赛题)。以及小数要用eps减小误差。[0]
9)多个if,else if,前后者冲突,如:

        if(flag==0&&i==1)
            t_flag=1;
        else if(flag==1&&i!=1)
            t_flag=0;
        else if(flag==1&&i==3)
            t_flag=2;

本来是想这么写的:

        if(flag==0&&i==1)
            t_flag=1;
        else if(flag==1&&i==3)
            t_flag=2;
        else if(flag==1&&i!=1)
            t_flag=0;

10)读错题目 曲解了题目意思。[0]
11)数据取余写错地方,导致超过long long 因为数据较大,经常有题需要取余什么的,有些地方相乘需要先mod之后再相乘。
这里写图片描述
这里1<=b[i]<=1e9,1<=l,r<=1e5,如果这样写的话两者想乘b[i]和l,r均取max的话,值就是1e28了,就爆long long了。
刷题常犯错误_第1张图片
导致我wa了一页,~~(>_<)~~。

自2016.12.7日凌晨开始统计出错次数
1错误处:(1) (6).(16年12月7日凌晨,cf下标和m异或之后,大于了起初开的10w,debug了块一个小时),(同时起初不止如此,for循环遍历下标的时候,应该是1到10w,而我写的是1到n)
http://codeforces.com/contest/742/problem/B
这里写图片描述
刷题常犯错误_第2张图片
刷题常犯错误_第3张图片
这里写图片描述
2:读题!!!读题!!!http://acm.hit.edu.cn/hoj/problem/view?id=4001238
很水的一道题,可是当初读题目的时候读错了,
刷题常犯错误_第4张图片卡了整整一个小时半,还是学长给说了正确题意之后才AC的,题目上给了一个11月的发货日期,并强调如果发货时间小于等于11号的话,到12月再发货,我一想,12月发货,那肯定是越早越好,那就是12月1号发货喽,( ̄ε(# ̄)☆╰╮( ̄▽ ̄///) 然后就是蜜汁wa,还被学长鄙视了一顿~~(>_<)~~,实际上是月份从11月变成了12月,日期不变!!!
3:多个if判断一个值,第一个if后面一定用else if,另外,不要凭自己的主观臆想猜测后台数据!!!
依旧是水题,首先是题目没说负数,这个当初我有考虑到,但是不知道负数二进制怎么搞,就假设了没有负数,然后就是wa,后来明白应该有负数,就用补码表示负数的二进制,写了一发,又是wa,蜜汁wa了三把才找到了bug,原来是if写错了。/(ㄒoㄒ)/刷题常犯错误_第5张图片没说不是负数,这个老是靠自己的主观判断,心想说不定是出题人没考虑到,后台全是正数呢。刷题常犯错误_第6张图片
所以以后若多个if判断一个值,if后面一定要用else if!!!
4:搜索过程中篡改了全局变量,导致结果出错!!!
刷题常犯错误_第7张图片
刷题常犯错误_第8张图片

刷题常犯错误_第9张图片
因为一个点在后续过程中可能会被多次搜到,但是标记过了之后就不能再重新修改了,而我在写的时候还是按照dfs的老套路写,结果就是一直被这道题卡,直到比赛结束。
5:题目读题理解出错,导致wa了三次。
刷题常犯错误_第10张图片

int a[100000+10];
for(j=a[i];; j--)
{
    if(a[i-1]%j==0)
    {
        ans+=a[i-1]/j,a[i-1]=j;
        break;
    }
}

题目中有说速度是实数,而我写的过程中是按照整数来写的,导致我wa了三次。
这里写图片描述

6:写题bug多多,手残写搓代码,有些情况无考虑到。
如:1.快速幂写错!

ll quick_mod(ll n)
{
    ll ans=1,a=1;
    while(n)
    {
        a=(a<<1)%mod;
        if(n&1)
            ans=ans*a%mod;
        n>>=1;
    }
    return ans;
}

一个求 2n 的sb快速幂,然而我写的全错了。
2.有一种情况五考虑到。

for(i=1; iif(i==1)
        dp[i+1]=s[i]-'0'-dp[i];
    else
        dp[i+1]=s[i]-'0'-dp[i]-dp[i-1];
    if(dp[i+1]<0) return 0;
}

dp[i+1]的取值范围是[0,2],然而我只是特判了<0,并没有>2的情况。
3.题目中不合法数据应该输出0,而我只是以为不存在这样的数据,并没有理会。

if(len==1)
{
    if(s[1]=='1') return 2;
    return 1;
}

在这里合法的数据s[1]只可能存在’0’,’1’,’2’三种情况,分别是’1’对应输出2,’0’和’1’输出1。但是如果是非法数据,应该输出0。我并没有考虑到。
这些bug导致我wa了七次。
刷题常犯错误_第11张图片

你可能感兴趣的:(心得)