ACM、PAT 错题本(不断更新)

报错及原因

语言细节

运算符的优先级

位运算

位运算的优先级是低于加减法的!因此希望位运算先计算的时候一定要记得加括号。

判断不清楚就直接加,保险。

Note:二分的时候是可以不加的:int mid = l + r >> 1;

三目运算符

写三目运算符的时候记得判断一下是否要加括号。

错误例子

希望计算一下前缀和,若 a [ i ] > = m i d a[i]>=mid a[i]>=mid 就当作 1 1 1,反之为 − 1 -1 1,与前面的 s [ i − 1 ] s[i - 1] s[i1] 相加。

错误的写法如下:

s[i] = s[i - 1] + a[i] >= mid ? 1 : -1;

这样写的话就会将 s[i - 1] + a[i] 先进行计算了。

正确写法

s[i] = s[i - 1] + (a[i] >= mid ? 1 : -1);  //加括号

STL使用

在使用vector的时候,只要是输入的vector是空的,程序就会崩溃。调试了一下,发现此时 0 < vector.size()-1 这个值为true。这个时候才反应过来,stl中的.size()函数返回的是unsigned int,这个类型下进行0-1会发生越界,所以变成了一个极大值。所以以后一定要注意不要使用stl中的.size()做减法这样的操作,如果使用的话先用int来强转一下类型来防止越界。
所以以后遇见要使用stl的返回值的时候尽量先把它摘出来

int len = G[u].size();

函数使用

floor()函数得到的是0

错误例子

double x = 5.0;
printf("%d", floor(x));  //得到的是0

正确写法

要转为 int

double x = 5.0;
printf("%d", (int)floor(x));  //得到的是0

Runtime Error(ACCESS_VIOLATION)

是指程序运行到一半就崩溃了。

可能原因

  • 除以0
  • 数组或指针越界
  • 数组开的太大

错误例子

指针的自增

写循环的时候写了一个:

while (a[j++] < x) {
    ans += n - i + 1;
}

报错如上,可能是因为 j j j 越界了,因为执行完该判断就会进行 j + + j++ j++,而应当是满足条件之后再进行 j + + j++ j++ 操作。

判断条件的顺序问题
if (next.x < maxn && next.x >= 0 && !vis[next.x]) {  //注意判断的顺序
    next.m = now.m + 1;
    q.push(next);
    vis[next.x] = true;
}

判断条件的时候是从左往右判断的,而 vis 数组元素最多为 maxn 。 写的时候 !vis[next.x] 写在了第一位,就有可能越界。

CE

头文件

报错信息

VJ上交了POJ的题:

F:\temp\22334742.9233\Main.cc:12:24: error: unordered_map: No such file or directory

报错原因

POJ 的 C++ 版本太老了,不支持部分头文件。

如万能头、unordered_map

语法

结构体中运算符重载

报错信息

POJ G++:

In file included from algorithm:62,
                 from F:\temp\22345844.20335\Main.cc:8:
stl_algo.h: In function 'const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = node]':
stl_algo.h:2268:   instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = node*, _Size = int]'
stl_algo.h:5220:   instantiated from 'void std::sort(_RAIter, _RAIter) [with _RAIter = node*]'
F:\temp\22345844.20335\Main.cc:58:   instantiated from here
stl_algo.h:89: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:90: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:92: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:96: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:98: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers

错误原因

看这篇博客

大致的意思就是:将非变量传递的类型不一致导致错误。实际上IDE也有提醒啦加个 const 就行了。

正确写法

结构体中运算符重载正确写法:

struct node{
    int x, y, h;
    bool operator < (const node &b) const {  //这里不加const会报错
        return h < b.h;
    }
}s[maxn * maxn];

之后排序直接美滋滋:

sort(s, s + cnt);  //进行排列

WA

可能原因

  • 忘记开 l o n g   l o n g long \ long long long

  • 忘记初始化

解决方法

  • 先用题给的最大数据范围自己跑一遍,看一下最大值是多少。

  • 如果会有多组数据,而样例只给了一组,可以直接复制一下,再跑一遍检查答案是否有错。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值