做题时需要注意的小细节

发现自己在做题的时候经常会重复犯一些很难发现的小细节错误,在这里记录下来,望谨记。

unsigned LL ou = 0; ou += (unsigned LL)pow(2.0,i);平时我在写题的时候从来不会注意强制转化的问题,但其实我已经好几次因为强制转化没有处理而wa了,而且每一次都会要找半天,pow函数返回的类型为double在加在例如LL,int等类型的数据上的时候,会出现一丝误差,需要强制转换才能解决,所以以后使用类似pow这种返回值和需要使用的值数据类型不同的时候,注意强制转化。

在使用STL类priority_queue时,对于队列里面的每一个值是默认从小到大排序的,也就是说如果你插入队列的值为1,2,3,4,5,那么从队列口开始依次是5,4,3,2,1,当你想要自定义优先队列的排列方式时,需要自己手写一个cmp结构体重载一下。举例如下

struct cmp
{
    bool operator()(const pair<int,int> a,const pair<int,int> b)const
    {
        if(a.first != b.first)
            return a.first < b.first;
        return a.second > b.second;
    }   
};

priority_queue< pair<int,int>,vector<pair<int,int> >,cmp>hp;

这是一个手写的存储形式为pair的优先队列,需要注意的是,如果你需要先按照第一个值从小到大,第二个值从大到小排列,根据优先队列默认less<T>的效果,你需要把所有手写的排序顺序反一下,比如上面的代码,如果你输入五个pair分别为(1,2),(1,3),(2,3),(2,4),(2,5),那么排好序后从队列头开始依次为(2,3),(2,4),(2,5),(1,2),(1,3)。优先队列可以在需要节省时间的时候用到,前提是你的代码不会爆内存。

热评文章