最近一直在刷洛谷上的题,做到2.1关了。这上面的题不算太难,就是比较麻烦,需要注意的细节有很多。像黑色星期五,坏掉的项链,这些题都挺麻烦的,项链这个题WA了好多次,我是枚举区间长度为n时向两边扩展做的,因为从数开始向左或向右,数的本身就是一个单位长度,所以在控制时要很细心才不会出错。在做题时也发现了很多的坑,对我来说算是坑吧,WA了好多次才注意到,就是在做回文素数时,数据量很大,10的8次方,遍历一遍能过,但是再加两个判断条件(是否为素数和是否回文)就超时。如果先判断回文在判断素数就不超时,因为判断素数的复杂度比判断回文的复杂度要高得多,就这个,一直超时,我和队友说,他们说肯定是要先判断回文,就我没注意到,,,,对我来说是个坑吧。类似的还有后面的等差数列,题意很明了,暴力枚举,一开始超时很严重,加了判断条件后就才200多秒,差距太大了,,,,以后还是要多多注意,优化代码。在做题时还扒了一个求一个数二进制时含有1的个数的模板,叫做平行算法:
int bitcount3(int n)
{
n=(n&0x55555555)+((n>>1)&0x55555555);
n=(n&0x33333333)+((n>>2)&0x33333333);
n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f);
n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff);
n=(n&0x0000ffff)+((n>>16)&0x0000ffff);
return n;
}
int型的最多计算5次就能算出来,虽然代码很丑陋,俺也没有具体看明白咋算的,总之很实用。