本来想氵一波题解,没想到管理员看见后被提醒关了题解通道,于是讲自己写的题解中警示后人的部分留下,警钟撅烂,警示后人(虽然后人可能不会有像我这么菜的了)
看到一些题解说从左上角出发和右上角没什么区别,试了一下好像确实没有区别,但还是从右上角走罢,因为这道题或许你没看见右上角,按习惯从左上角走能对,但下一道题呢?不是每道题都可以的啊。
不知道有没有人和我一样在如何存储同一个编号的两颗宝石上卡了一会。这个其实只用存最开始的一颗就行,因为等到第二颗的时候我们直接就求魔法值、比较然后就不再用它们了。
还是不知道有没有人和我一样,我最开始的判断两颗宝石是这样写的:
int pos = tim % ((n * m) / 2); //取出宝石编号
if(pos != tim){ //tim已经焯了,因为在(n + m / 2)以下的同种宝石只会有一个
//那么就开始计算
tx = bao[pos][0],ty = bao[pos][1];
ma = max(ma, abs(x - tx) * k1 + abs(y - ty) * k2); //计算最大值
}else{ //说明是第一颗
bao[pos][0] = x,bao[pos][1] = y;
}
我这么写是根据(我觉得的)第一颗宝石编号一定小于 2n×m,因此模它等于自己,而大于的那个模它并不是自己。
事实上这个是错的,这个从题目分析从自己分析也好,题目的最后这么说的:

所以会出现 i=0 的情况,那么像我上面这么写的话,是 0 的时候就没法判定。因此这是错的,如此就会保龄。
个人实测四个 if 语句相较于 for 循环还是能快上 20ms 的,因为前者我跑到了 121ms,而后者怎么跑都是 140ms。